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

歡迎訪問 生活随笔!

生活随笔

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

linux

Linux系统编程:代码实现多重管道功能

發布時間:2025/3/15 linux 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux系统编程:代码实现多重管道功能 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

代碼功能介紹

我們在linux命令中可以使用 | 進行數據的流動,比如命令 ls -l | grep fifo | wc -l 如下圖。這就是多重管道,今天我們用代碼來實現類似的功能。


代碼實現思路

管道 | 的實現當然要用到pipe函數 用來創建管道,每條單獨的命令 用一個子進程來實現,linux命令默認是STDIN_FILENO作為輸入端,STDOUT_FILENO作為輸出端。故此,會用到dup2文件描述符重定向。父進程負責回收子進程。只要思路清晰代碼實現就不難了。當然如果是 3重、4重管道,思路都一樣。需要注意的是,pipe的創建一定是在fork子進程之前,為了保證管道單向流動每個進程必須將沒有用到的讀寫端close掉

代碼展示

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <error.h> #include <sys/errno.h> #include <sys/wait.h> //利用管道實現 ls -l | grep "fifo" | wc -l 功能 //所以需要2 根管道 int main(int argc,char* argv[]) {pid_t pid,wpid;int i,fd[2],fd2[2],status;pipe(fd);pipe(fd2);for( i = 0; i < 3; i++ ){if((pid = fork()) == 0){//子進程break;}else if( pid < 0 ){perror("fork error");exit(1);}}if( i == 0 ){printf("child pid = %d,ppid = %d\n",getpid(),getppid());//將管道不相關的端口關閉close(fd2[0]);close(fd2[1]);close(fd[0]);//子進程1 執行ls 將結果寫出到管道1dup2(fd[1],STDOUT_FILENO);execlp("ls","ls","-l",NULL);perror("ls error");}else if( i == 1 ){printf("child pid = %d,ppid = %d\n",getpid(),getppid());close(fd[1]);close(fd2[0]);//子進程2 grep "fifo*" 從管道1中讀入數據,并輸出到管道2dup2(fd[0],STDIN_FILENO);dup2(fd2[1],STDOUT_FILENO);execlp("grep","grep","fifo",NULL);perror("cat error");}else if( i == 2 ){printf("child pid = %d,ppid = %d\n",getpid(),getppid());close(fd[0]);close(fd[1]);close(fd2[1]);//子進程3 wc -l 從管道2中讀入數據,將最終結果輸出的屏幕dup2(fd2[0],STDIN_FILENO);execlp("wc","wc","-l",NULL);perror("wc error");}else{//父進程2根管道的 2端都要關閉 為了不影響子進程的管道通信 ,而且必須放在fork完子進程后才可以關閉。close(fd[0]);close(fd[1]);close(fd2[0]);close(fd2[1]);// 父進程 回收子進程while( (wpid = waitpid(-1,&status,WNOHANG)) != -1 ){if(wpid > 0){printf("child pid = %d,by recycle.",wpid);if(WIFEXITED(status)){//程序正常退出printf("normal exit,exit num = %d\n",WEXITSTATUS(status));}else if( WIFSIGNALED(status) ){//程序被信號終止printf("terminate by signal,signal num = %d\n",WTERMSIG(status));}}}}return 0; }

運行結果


新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!

總結

以上是生活随笔為你收集整理的Linux系统编程:代码实现多重管道功能的全部內容,希望文章能夠幫你解決所遇到的問題。

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