免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6519 | 回复: 10
打印 上一主题 下一主题

[C] 管道破裂、关闭,epoll无事件返回,求高人指点 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-13 15:19 |只看该作者 |倒序浏览
问题:
1 我建立了一对管道,
2. 用fork了一个子进程,父进程读,子进程写。
3. 父进程用epoll监听管道,

但是子进程关闭写端,或退出。epoll没事件返回给我。怎么办呢?
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <sys/epoll.h>

  5. int main()
  6. {
  7.         int fds[2];
  8.         pid_t pid;

  9.         pipe(fds);

  10.         pid = fork();
  11.         if (pid == 0) {
  12.                 /* child */
  13.                 sleep(2);
  14.                 close(fds[1]);
  15.                 close(fds[0]);
  16.                 printf("exit!\n");
  17.                 exit(0);
  18.         } else if (pid > 0) {
  19.                 /* father */
  20.                 struct epoll_event ev, events[10];
  21.                 ev.data.fd = fds[0];
  22.                 ev.events = EPOLLIN|EPOLLOUT|EPOLLHUP;
  23.                 int epfd = epoll_create(10);
  24.                 epoll_ctl(epfd, EPOLL_CTL_ADD, fds[0], &ev);
  25.                 for (;;) {
  26.                         int ret = epoll_wait(epfd, events, 10, 3000);
  27.                         printf("epoll returns %d\n", ret);
  28.                         if (ret == 0) {
  29.                                 close(fds[0]);
  30.                                 close(fds[1]);
  31.                                 continue;
  32.                         }

  33.                         int i = 0;
  34.                         for (i = 0; i < ret; i++) {
  35.                                 if (events[i].events & EPOLLIN)
  36.                                         printf("EPOLLIN");
  37.                                 else if (events[i].events & EPOLLOUT)
  38.                                         printf("EPOLLOUT");
  39.                                 else if (events[i].events & EPOLLHUP)
  40.                                         printf("EPOLLHUP");
  41.                                 else
  42.                                         printf("lsdkfsdlfksljf");
  43.                                 printf("\n");

  44.                         }
  45.                 }
  46.         }

  47.         return 0;
  48. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-05-13 15:19 |只看该作者
在线等。谢谢

论坛徽章:
0
3 [报告]
发表于 2010-05-13 16:08 |只看该作者
你觉得你子进程关闭管道描述符会通知你的父进程么?这不合理吧
close(fds[1]);
int ret = epoll_wait(epfd, events, 10, 3000);
你这样修改试一下  
子进程那块应该没关系吧     @newbie@

论坛徽章:
0
4 [报告]
发表于 2010-05-13 16:18 |只看该作者
回复 1# 79hy


    管道有一端关闭的时候   epoll另一端会收到0,此时可以把这个fd删除监听了

论坛徽章:
0
5 [报告]
发表于 2010-05-13 17:58 |只看该作者
回复 3# 1226ehziy


    那你觉得socket对端关闭了,怎么epoll怎么就能捕获到呢?呵呵。

论坛徽章:
0
6 [报告]
发表于 2010-05-13 17:59 |只看该作者
回复 4# 梅川内依酷


    你测试了吗?连事件都没有,怎么可能去触发读呢?

论坛徽章:
0
7 [报告]
发表于 2010-05-13 18:27 |只看该作者
本帖最后由 梅川内依酷 于 2010-05-13 18:33 编辑

回复 7# 79hy


   =

论坛徽章:
0
8 [报告]
发表于 2010-05-13 20:23 |只看该作者
回复 6# 79hy


    你可以测试一下嘛!看看是不是想要的结果。改为write试试。@newbie@

论坛徽章:
0
9 [报告]
发表于 2010-05-14 10:18 |只看该作者
看来管道关闭,除了主动去读取,没有别的办法了?

论坛徽章:
0
10 [报告]
发表于 2010-05-15 12:29 |只看该作者
只能在epoll中超时去读下管道,失败就干掉。呵呵。谢谢大家了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP