温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

[Linux管道和IPC]管道的实际应用2

发布时间:2020-08-03 14:47:28 来源:网络 阅读:363 作者:银河星君 栏目:编程语言
#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); }


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI