免费注册 查看新帖 |

Chinaunix

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

[函数] 求助验证断开的管道的问题 [复制链接]

论坛徽章:
0
发表于 2010-12-07 22:53 |显示全部楼层
以下有两段代码,两段代码的区别就是在fork后if判断大于0还是等于0那里,其他代码都是一样的。
我想验证断开的管道的现象,据说是读端关闭后进行写操作会发送SIGPIPE信号导致进程终止,所以我在父进程(代码一)和子进程(代码二)分别写了一下管道,写之前sleep操作,同时另一个进程关闭读端。
问题:
1执行结果代码一在父进程write时提示了断开的管道,代码二在子进程write时直接退出了没有任何提示,这是为什么?
2write时如果读端已经关闭,write不是返回-1置errno为EPIPE吗,为什么没有显示write返回值啊,难道收到SIGPIPE信号进程直接退出了,write的说明有问题吗?

请高手不吝赐教。

代码一:
  1. #include <unistd.h>
  2. #include <sys/types.h>
  3. main()
  4. {
  5.         int pfd[2];
  6.         int rt=0;
  7.         char buf[10];
  8.         pid_t pid;
  9.         rt=pipe(pfd);
  10.         printf("pfd[0]=%d  pfd[2]=%d\n",pfd[0],pfd[1]);

  11.         if((pid=fork())<0)
  12.                 perror("fork");
  13.         else         if(pid==0)
  14.                 {        close(pfd[0]);
  15.                         close(pfd[1]);
  16.                         printf("p1 exit\n");
  17.                         exit(0);
  18.                 }
  19.                 else
  20.                 {
  21.                         printf("p20\n");
  22.                         sleep(3);
  23.                         printf("p21\n");
  24.                         close(pfd[0]);
  25.                         printf("p22\n");
  26.                         rt=write(pfd[1],"hello",6);
  27.                         printf("p2rt=%d\n",rt);
  28.                         close(pfd[1]);
  29.                         printf("p2exit\n");
  30.                         exit(0);
  31.                 }
  32. }
复制代码
执行结果:
  1. [root@localhost 8]# ./a.out
  2. pfd[0]=3  pfd[2]=4
  3. p1 exit
  4. p20
  5. p21
  6. p22
  7. 断开的管道
  8. [root@localhost 8]#
复制代码
代码二:
  1. #include <unistd.h>
  2. #include <sys/types.h>
  3. main()
  4. {
  5.         int pfd[2];
  6.         int rt=0;
  7.         char buf[10];
  8.         pid_t pid;
  9.         rt=pipe(pfd);
  10.         printf("pfd[0]=%d  pfd[2]=%d\n",pfd[0],pfd[1]);

  11.         if((pid=fork())<0)
  12.                 perror("fork");
  13.         else         if(pid>0)
  14.                 {        close(pfd[0]);
  15.                         close(pfd[1]);
  16.                         printf("p1 exit\n");
  17.                         exit(0);
  18.                 }
  19.                 else
  20.                 {
  21.                         printf("p20\n");
  22.                         sleep(3);
  23.                         printf("p21\n");
  24.                         close(pfd[0]);
  25.                         printf("p22\n");
  26.                         rt=write(pfd[1],"hello",6);
  27.                         printf("p2rt=%d\n",rt);
  28.                         close(pfd[1]);
  29.                         printf("p2exit\n");
  30.                         exit(0);
  31.                 }
  32. }
复制代码
  1. [root@localhost 8]# ./a.out
  2. pfd[0]=3  pfd[2]=4
  3. p20
  4. p1 exit
  5. [root@localhost 8]# p21
  6. p22
复制代码

论坛徽章:
0
发表于 2010-12-07 23:09 |显示全部楼层
在write时,信号产生,程序就退出了。
你可以把SIGPIPE忽略掉,或者捕捉这个信号。

论坛徽章:
0
发表于 2010-12-08 17:06 |显示全部楼层
两个代码是一样的吧,lz
判断是不是父亲进程有什么关系吗?

论坛徽章:
0
发表于 2010-12-08 19:42 |显示全部楼层
本帖最后由 wkathy 于 2010-12-08 19:45 编辑

回复 3# ydfgic


    不一样,if判断>0和==0不一样。

   我的第一句话就已经说明两段代码的区别了

因为这两个程序执行结果不一样,所以才问的。

现在我感觉两个程序的结果应该是一样的,只不过父进程写崩溃出现的“断开的管道”是shell提示的,而如果子进程写崩溃shell不提示吧?我猜

论坛徽章:
0
发表于 2010-12-08 19:44 |显示全部楼层
回复 2# korpus


    现在我感觉两个程序的结果应该是一样的,都是读端关闭,写端因为收到SIGPIPE而终止。

   只不过父进程写崩溃出现的“断开的管道”是shell提示的,而如果子进程写崩溃shell不提示吧?

  我猜,不知道是不是这个原因。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP