日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux学习之系统编程篇:利用管道进行进程间通信

發布時間:2024/9/30 linux 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux学习之系统编程篇:利用管道进行进程间通信 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這里我們先補充一個小知識:
父子進程使用 pipe 進行通信時fork 和 pipe 先后的順序是先 pipe,后 fork,因為父進程先創建管道,再 fork 創建子進程,這樣才能是父子進程共享一塊管道的讀寫操作符。
進行通信的代碼如下:

#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> int main() {int pipefd[2]; // 先創建管道pipe(pipefd);int i;for(i = 0; i < 2; i++) { // 再創建2個子進程pid_t pid = fork();if(pid == 0) {break;}}if(i == 0) // 子進程1 實現 ps aux // 實現寫入{close(pipefd[0]); // 關閉讀端 // ps 會將結果輸出至屏幕,即寫到了標準輸出,因此需要文件描述符重定向,寫到管道寫端(流入管道)dup2(pipefd[1], STDOUT_FILENO); execlp("ps", "ps", "aux", NULL);perror(“execlp”); // exec調用失敗后作錯誤輸出exit(1);}if(i == 1) // 子進程2 gerp // 實現讀出{close(pipefd[1]); // 關閉寫端dup2(pipefd[0], STDIN_FILENO); // grep是從標準輸入讀,文件描述符重定向,從管道讀execlp("grep", "grep", "bash", NULL); perror(“execlp”); // exec調用失敗后作錯誤輸出exit(1);}if(i == 2) // 父進程 回收子進程{close(pipefd[0]);close(pipefd[1]); // 關閉兩端pid_t wpid;while( (wpid = waitpid(-1, NULL, WNOHANG) ) != -1{ if( wpid == 0) continue;printf(“child died pid = %d\n”, wpid); }}return 0; }

注:若父子間進行通信時,父進程實現 ps,子進程實現 grep時,父進程會使用 execlp 函數,父進程原碼會被替換掉,無法回收子進程。

總結

以上是生活随笔為你收集整理的Linux学习之系统编程篇:利用管道进行进程间通信的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。