顧得泉:個人主頁
個人專欄:《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系統的分享到這里就結束了,希望本篇文章的分享會對大家的學習帶來些許幫助,如果大家有什么問題,歡迎大家在評論區留言~~~??