免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1194 | 回复: 1

[Linux] 父子进程管道通信,挂起不响应了,帮我看下吧 [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2017-03-05 15:30 |显示全部楼层
我在当前目录下有一个文本文件叫做tmp,我想cat这个文件,然后sort它。我采用一个c程序来模拟管道,用父子进程协作来做这件事情。
但是cat执行完之后,程序卡住了,不再往下走了。帮我看下为什么吧,怎么改


  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<unistd.h>
  4. int main(){
  5.     int pipefd[2];
  6.     pipe(pipefd);
  7.     int& readfd=pipefd[0];
  8.     int& writefd=pipefd[1];

  9.     pid_t pid=fork();
  10.     if(pid==0){//子进程
  11.         dup2(STDIN_FILENO,writefd);
  12.         close(readfd);
  13.         execlp("cat","cat","tmp",NULL);
  14.         printf("子进程cat退出\n");
  15.         exit(0);
  16.     }else{//父进程
  17.         dup2(STDOUT_FILENO,readfd);
  18.         close(writefd);
  19.         execlp("sort","sort",NULL);
  20.         printf("父进程sort退出\n");
  21.     }
  22.     int status;
  23.     wait(&status);
  24.     printf("父进程结束\n");
  25.     return 0;
  26. }
复制代码


程序在打印了tmp这个文件的之后就卡住了,不往下走了。如何解决呢?



论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2017-03-05 20:51 |显示全部楼层
本帖最后由 MMMIX 于 2017-03-05 20:53 编辑

回复 1# asker160

这是能正确工作的代码:

  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<unistd.h>
  4. int main(){
  5.         int pipefd[2];
  6.         pipe(pipefd);
  7.         int readfd=pipefd[0];
  8.         int writefd=pipefd[1];

  9.         pid_t pid=fork();
  10.         if(pid==0){//子进程
  11.                 dup2(writefd,STDOUT_FILENO);
  12.                 close(readfd);
  13.                 execlp("cat","cat","tmp",NULL);
  14.                 exit(EXIT_FAILURE);
  15.         }else{//父进程
  16.                 dup2(readfd,STDIN_FILENO);
  17.                 close(writefd);
  18.                 execlp("sort","sort",NULL);
  19.                 exit(EXIT_FAILURE);
  20.         }
  21. }

复制代码


1. 改为了 C 语法;
2. 修正了逻辑错误;
3. 删去了无用代码。



评分

参与人数 1信誉积分 +10 收起 理由
asker160 + 10 很给力!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

基于案例的 SQL 优化实战训练营

讲师:中电福富特级专家梁敬彬,参与本次课程培训,你将收获:
1. 能编写出较为高效的 SQL;
2. 能解决70%以上的数据库常见优化问题;
3. 能得到老师提供的高效的相关工具和解决方案;
4. 能举一反三,收获不仅仅是 SQL 优化。
现在购票享受8.8折优惠!
----------------------------------------
优惠时间:2019年3月20日前

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP