亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 6598 | 回復(fù): 10
打印 上一主題 下一主題

[C] 管道破裂、關(guān)閉,epoll無事件返回,求高人指點(diǎn) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2010-05-13 15:19 |只看該作者 |倒序?yàn)g覽
問題:
1 我建立了一對(duì)管道,
2. 用fork了一個(gè)子進(jìn)程,父進(jìn)程讀,子進(jìn)程寫。
3. 父進(jìn)程用epoll監(jiān)聽管道,

但是子進(jìn)程關(guān)閉寫端,或退出。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. }
復(fù)制代碼

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2010-05-13 15:19 |只看該作者
在線等。謝謝

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2010-05-13 16:08 |只看該作者
你覺得你子進(jìn)程關(guān)閉管道描述符會(huì)通知你的父進(jìn)程么?這不合理吧
close(fds[1]);
int ret = epoll_wait(epfd, events, 10, 3000);
你這樣修改試一下  
子進(jìn)程那塊應(yīng)該沒關(guān)系吧     @newbie@

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2010-05-13 16:18 |只看該作者
回復(fù) 1# 79hy


    管道有一端關(guān)閉的時(shí)候   epoll另一端會(huì)收到0,此時(shí)可以把這個(gè)fd刪除監(jiān)聽了

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2010-05-13 17:58 |只看該作者
回復(fù) 3# 1226ehziy


    那你覺得socket對(duì)端關(guān)閉了,怎么epoll怎么就能捕獲到呢?呵呵。

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2010-05-13 17:59 |只看該作者
回復(fù) 4# 梅川內(nèi)依酷


    你測(cè)試了嗎?連事件都沒有,怎么可能去觸發(fā)讀呢?

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2010-05-13 18:27 |只看該作者
本帖最后由 梅川內(nèi)依酷 于 2010-05-13 18:33 編輯

回復(fù) 7# 79hy


   =

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2010-05-13 20:23 |只看該作者
回復(fù) 6# 79hy


    你可以測(cè)試一下嘛!看看是不是想要的結(jié)果。改為write試試。@newbie@

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2010-05-14 10:18 |只看該作者
看來管道關(guān)閉,除了主動(dòng)去讀取,沒有別的辦法了?

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2010-05-15 12:29 |只看該作者
只能在epoll中超時(shí)去讀下管道,失敗就干掉。呵呵。謝謝大家了。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP