Linux系統---基于Pipe實現一個簡單Client-Server system

顧得泉:個人主頁

個人專欄:《Linux操作系統》??《C/C++》??《LeedCode刷題》

鍵盤敲爛,年薪百萬!


一、題目要求

???????Server是一個服務器進程,只能進行整數平方運算。Client要計算一個整數的平方的平方的平方,即(((x)^2)^2)^2,我們通過Client與Server的三次通信來完成計算:第一次Client通過command管道將x送到Server,由Server計算出x^2,并通過response管道送回Client。第二次,Client收到x^2后,將其通過command管道再次送到Server,由Server計算出(x^2)^2,并通過response管道送回Client。如此過程,經過三次通信過程,可以計算出(((x)^2)^2)^2,然后由Client打印出計算結果。


二、模塊描述

???????本文用于創建一個子進程,并通過管道進行通信。主進程將一個整數n發送給子進程,子進程計算n的平方并將結果返回給主進程。最后,主進程打印出子進程計算得到的結果。

????????1.首先,通過atoi(argv[1])將命令行參數轉換為整數n。

????????2.定義兩個整數數組com和res,分別用于存儲管道的讀端和寫端的文件描述符。

????????3.使用pipe()函數創建兩個管道,分別將com[0]和com[1]作為讀端,將res[0]和res[1]作為寫端。

????????4.使用fork()函數創建一個子進程。如果創建失敗,輸出錯誤信息并退出程序。

????????5.如果當前進程是父進程(pid > 0),則關閉管道的讀端和寫端,然后循環4次,每次向管道的寫端寫入整數n,并從管道的讀端讀取整數n。

????????6.在循環結束后,打印子進程計算得到的結果n,然后使用kill()函數發送SIGKILL信號終止子進程,接著使用waitpid()函數等待子進程結束。最后,退出主進程。

????????7.如果當前進程是子進程(pid == 0),則關閉管道的讀端和寫端,然后進入一個無限循環。在循環中,從管道的讀端讀取整數n,計算n的平方,并將結果寫入管道的寫端。當讀取到的整數為負數時,跳出循環。最后,退出子進程。


三、代碼實現

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>#define MAXLINE 20  int main(int argc, char* argv[]) 
{int n = atoi(argv[1]);  int com[2];   int res[2];   pid_t pid;if (pipe(com) < 0 || pipe(res) < 0) {perror("pipe error");exit(EXIT_FAILURE);}if ((pid = fork()) < 0) {perror("fork error");exit(EXIT_FAILURE);}if (pid > 0) {    close(com[0]);  close(res[1]); for (int i = 1; i < 4; i++) {write(com[1], &n, sizeof(int));  read(res[0], &n, sizeof(int));  }printf("result is %i\n", n);kill(pid, SIGKILL);   waitpid(pid, NULL, 0); exit(EXIT_SUCCESS);} else {     close(com[1]);  close(res[0]);  while (1) {if (read(com[0], &n, sizeof(int)) <= 0)  break;  n = n * n;   write(res[1], &n, sizeof(int));  }exit(EXIT_SUCCESS);}
}

四、結果展示

? ? ? ?當我們把相對應的文檔編輯好后,首先進行的是gcc操作,接著進行運行,運行的時候要把相對應要求的參數傳進去,比方說要求2的8次方,就進行下述操作,具體實現步驟與結果如下:


結語:Linux系統基于Pipe實現一個簡單Client-Server system系統的分享到這里就結束了,希望本篇文章的分享會對大家的學習帶來些許幫助,如果大家有什么問題,歡迎大家在評論區留言~~~??

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214422.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214422.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214422.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

聊聊 Jetpack Compose 原理 -- 穿透刺客 CompositionLocal

Compose 官方說明一直很簡潔&#xff1a;CompositionLocal 是通過組合隱式向下傳遞數據的工具。 我們先來看一段代碼&#xff1a; class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setCo…

datav-輪播排名-對數據進行處理

前言 對于大屏需求我們排名數據輪播也是經常需要用到的需求&#xff0c;datav也是給我們提供了 不是說我們自己不能寫&#xff0c;而是提供好的輪子比我們自己 寫的&#xff0c;更全面&#xff0c;更周到&#xff0c; 沒有特殊需求的話&#xff0c;使用datav配置一下完成這個…

mysqlsh導入json,最終還得靠navicat導入json

工作需要將一個巨大的10G的json導入mysql數據庫。 看到mysql官方有對json導入的支持。 如下&#xff1a; MySQL :: Import JSON to MySQL made easy with the MySQL Shell $ mysqlsh rootlocalhost:33300/test --import /path_to_file/zips.json Creating a session to root…

產品經理進階:以客戶為中心的8個維度

目錄 簡介 以客戶為中心 流程和組織維度 產品維度 CSDN學院《硬件產品進階課》

python:六種算法(DBO、RFO、WOA、GWO、PSO、GA)求解23個測試函數(python代碼)

一、六種算法簡介 1、蜣螂優化算法DBO 2、紅狐優化算法RFO 3、鯨魚優化算法WOA 4、灰狼優化算法GWO 5、粒子群優化算法PSO 6、遺傳算法GA 二、6種算法求解23個函數 &#xff08;1&#xff09;23個函數簡介 參考文獻&#xff1a; [1] Yao X, Liu Y, Lin G M. Evolution…

讀書筆記 | 自我管理的關鍵是提高執行力

哈嘍啊&#xff0c;你好&#xff0c;我是雷工&#xff01; 有句話說&#xff0c;能管好自己才是真的本事。 自我管理&#xff0c;管好自己很重要。 我們之所以懂得這么多的道理&#xff0c;卻依然過不好這一生&#xff1f; 很大部分原因是因為管不住自己&#xff0c;做不到。 …

性能測試基礎

性能測試分類 客戶端性能&#xff1a;測試APP自身的性能&#xff0c;例如CPU、內存消耗&#xff1b;web頁面元素渲染速度 服務端性能&#xff1a;測試服務端項目程序的支持的并發、處理能力、響應時間等&#xff0c;主要通過接口來做性能測試 性能測試指標 并發 同時向服務…

大一作業習題

第一題&#xff1a;答案&#xff1a; #include <stdio.h> void sort(int a[], int m) //將數組a的前m個元素(從小到大)排序 {int i 0;for (i 0; i < m - 1; i){int j 0;int flag 1;for (j 0; j < m - 1 - i; j){if (a[j] > a[j 1]){int t 0;t a[j];…

Java八股文面試全套真題【含答案】- Servlet篇

以下是一些關于Servlet的經典面試題以及它們的答案&#xff1a; 什么是 Servlet&#xff1f; 答案&#xff1a;Servlet 是運行在服務器上&#xff0c;用于處理客戶端請求并生成響應的 Java 類。 Servlet 和 JSP 之間的區別是什么&#xff1f; 答案&#xff1a;Servlet 是基于…

1.鴻蒙應用程序開發app_hap開發環境搭建

1.下載Node.js, Javascipts的運行環境 node.js版本下載v12.18.3/https://www.cnblogs.com/txwtech/p/17865780.html 2.下載并安裝DevEco Studio DevEco Studio 3.1 DevEco Studio 3.1配套支持HarmonyOS 3.1版本及以上的應用及服務開發&#xff0c;提供了代碼智能編輯、低代…

Docker筆記:Docker中簡單配置Mysql/Redis/Mongodb容器

Docker 配置 Mysql 容器 1 &#xff09;方案1&#xff1a;基于centos等linux操作系統 啟動centos鏡像&#xff0c;在里面安裝 mysql這樣比較麻煩&#xff0c;配置的東西很多 … 2 &#xff09;方案2&#xff1a;直接用 mysql 鏡像 (推薦) $ docker pull mysql 下載鏡像$ do…

589. N 叉樹的前序遍歷

589. N 叉樹的前序遍歷 java1&#xff1a;stack棧&#xff1a;沒看懂 class Solution {public List<Integer> preorder(Node root) {List<Integer> res new ArrayList<Integer>();if (root null) {return res;}Map<Node, Integer> map new HashMa…

C盤瘦身,C盤清理

以下只是我的C盤清理經驗~ 一.【用軟件簡單清理C盤】 使用一些垃圾清理軟件&#xff0c;簡單的初步把C盤先清理一遍。&#xff08;這種軟件太多我就不推薦了……&#xff09; 二.【WPS清理大師】 因為我電腦裝了WPS&#xff0c;發現右鍵單擊C盤有個選項【釋放C盤空間】&#xf…

接口自動化框架(Pytest+request+Allure)

前言&#xff1a; 接口自動化是指模擬程序接口層面的自動化&#xff0c;由于接口不易變更&#xff0c;維護成本更小&#xff0c;所以深受各大公司的喜愛。 接口自動化包含2個部分&#xff0c;功能性的接口自動化測試和并發接口自動化測試。 本次文章著重介紹第一種&#xff0c…

Vue3.3.4中watch無法監測props的更改

背景 網上說了很多解決方案&#xff0c;都是通過watch(() > props.value, (newValue, oldValue) > {})解決&#xff0c;或者是加上{deep: true}附加屬性。但是我在Vue3.3.4中&#xff0c;還是無法解決。 下面說一下我的解決方案。 解決方案 通過父組件調用子組件defineE…

點云/Mesh 常見處理庫和軟件匯總

注&#xff1a;參考 網址1、網址2 文章目錄 軟件通用點云/Mesh處理庫通用幾何處理庫專用功能庫 軟件 Processing MeshLabCloudCompareTrimeshPyVistaVedo Visualization Simple-3dvizPlotOptiX (Requires CUDA-enabled GPU)PolyscopePyrender 通用點云/Mesh處理庫 PCL &am…

【開發問題】vue的前端和java的后臺,用sm4,實現前臺加密,后臺解密

sm4加密 vue引入的包代碼加密解密 javamaven代碼運行結果 vue 引入的包 npm install sm-crypto代碼加密解密 加密&#xff1a; key &#xff1a;代表著密鑰&#xff0c;必須是16 字節的十六進制密鑰 password &#xff1a;加密前的密碼 sm4Password &#xff1a;代表sm4加密…

Python之格式化保存數據點

功能&#xff1a;將平面點集存儲為格式化txt文檔&#xff0c;每個坐標值為5位整數&#xff0c;前三位為整數&#xff0c;后2位為小數 輸入&#xff1a;平面點坐標&#xff0c;用列表存儲&#xff0c;列表的元素為點坐標元組 輸出&#xff1a;txt文件&#xff0c;每行一個點坐…

【計算機網絡】應用層電子郵件協議

一、電子郵件系統架構 電子郵件是一個典型的異步通信系統&#xff0c;發送方從UA&#xff0c;也就是郵件客戶端&#xff0c;通過應用層SMTP協議&#xff0c;傳輸層tcp協議&#xff0c;發送給發送方的郵件服務器&#xff0c;比如使用的是163郵箱&#xff0c;163提供的SMTP服務器…

python中實現yaml文件管理參數

yaml參數管理器 這是文件目錄關系&#xff0c;其中config存放.yaml文件&#xff0c;scripts存放py文件 然后就可以自由使用了&#xff1a; import yaml import os#獲取路徑 script_directory os.path.dirname(os.path.abspath(__file__)) # 相對于腳本文件的路徑 image_relat…