[Linux管道和IPC]管道的實際應用2
阿新 • • 發佈:2017-11-18
linux管道
#include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <limits.h> #include <string.h> #include <sys/wait.h> #include <error.h> #define DEF_PAGER "/bin/more" //定義處理函數 #define MAXLINE 4096 //行最大字符數 int main(int argc, char *argv[]) { int n; int fd[2]; pid_t pid; char *pager, *argv0; char line[MAXLINE]; FILE *fp; if (argc != 2) //如果參數不正確 { printf("請輸入正確的命令:<pathname>\n"); exit(1); } if ((fp = fopen(argv[1], "r")) == NULL) //如果以只讀打開argv[1]指向的文件出錯 { printf("不能打開文件%s", argv[1]); exit(1); } if (pipe(fd) < 0) //創建管道失敗 { printf("創建管道失敗\n"); exit(0); } if ((pid = fork()) < 0) //創建子進程失敗 { printf("創建子進程失敗\n"); exit(0); } else if (pid > 0) { //父進程 close(fd[0]); //關閉讀文件描述符 //將argv[1]通過管道發送 while (fgets(line, MAXLINE, fp) != NULL) { n = strlen(line); if (write(fd[1], line, n) != n) { printf("寫管道失敗\n"); exit(1); } } if (ferror(fp)) //如果文件描述符出錯 { printf("fgets 失敗\n"); exit(1); } close(fd[1]); // if (waitpid(pid, NULL, 0) < 0) { printf("waitpid失敗\n"); exit(1); } exit(0); } else //子進程 { close(fd[1]); if (fd[0] != STDIN_FILENO) { if (dup2(fd[0], STDIN_FILENO) != STDIN_FILENO) { printf("dup2到標準輸入失敗\n"); exit(1); } close(fd[0]); /* don‘t need this after dup2 */ } //exec函數的參數 if ((pager = getenv("PAGER")) == NULL) { pager = DEF_PAGER; } if ((argv0 = strrchr(pager, ‘/‘)) != NULL) { argv0++; } else { argv0 = pager; } if (execl(pager, argv0, (char *)0) < 0) { printf("調用execl失敗%s", pager); exit(1); } } exit(0); }
本文出自 “10628473” 博客,請務必保留此出處http://10638473.blog.51cto.com/10628473/1983130
[Linux管道和IPC]管道的實際應用2