Linux系统编程:代码实现多重管道功能
生活随笔
收集整理的這篇文章主要介紹了
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系统编程:代码实现多重管道功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab实现一/多元非线性回归
- 下一篇: git报错:fatal: remote