免费注册 查看新帖 |

Chinaunix

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

[C] pipe 单进程有问题吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-16 13:58 |只看该作者 |倒序浏览
本帖最后由 newbuding 于 2010-04-16 13:59 编辑

大家帮忙看看,这样使用有问题吗?
在我的电脑上用kill -CONT `pidof sigpipe`只输出了
Enter cont
Leave cont

没有唤醒select,这是为什么啊?
  1. #include <signal.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <unistd.h>


  5. static int main_pipe[2];

  6. void cont(int sig)
  7. {
  8.     printf("Enter cont\n");
  9.     write(main_pipe[1], "0", 1);
  10.     printf("Leave cont\n");
  11. }

  12. int main(int argc, char *argv[])
  13. {
  14.     pid_t pid;
  15.     int stat;
  16.     char ch[1];
  17.     int rc;
  18.     fd_set fds;

  19.     //signal(SIGINT, ouch);
  20.     signal(SIGCONT, cont);

  21.     if (pipe(main_pipe) < 0) {
  22.         perror("pipe()");
  23.         exit(1);
  24.     }

  25.     printf("pipe(%d:%d)\n", main_pipe[0], main_pipe[1]);

  26.     while(1) {

  27.         FD_ZERO(&fds);
  28.         FD_SET(main_pipe[0], &fds);

  29.         rc = select(main_pipe[0]+1, &fds, NULL, NULL, NULL);
  30.         if (rc < 0) {
  31.             continue;
  32.         }

  33.         if (FD_ISSET(main_pipe[0], &fds)) {
  34.             char x;
  35.             while (read(main_pipe[0], &x, 1) > 0) {}
  36.         }

  37.         printf(".");
  38.     }

  39.     exit(0);
  40. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-04-16 14:04 |只看该作者
IPC = Inter-Process Communication

论坛徽章:
0
3 [报告]
发表于 2010-04-16 14:05 |只看该作者
回复 2# langue


    老大不懂啊,详细说说

论坛徽章:
0
4 [报告]
发表于 2010-04-16 15:17 |只看该作者
呵呵,我来当翻译把...
IPC 就是进程间通信   (这个间可以了解为相互,相互的充分必要就是>=2了)
当然不排除你在做某些事的时候是DIY的,没有你在我自己来.自己来

还是先fork一下把

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
5 [报告]
发表于 2010-04-17 10:09 |只看该作者
大家帮忙看看,这样使用有问题吗?
在我的电脑上用kill -CONT `pidof sigpipe`只输出了

没有唤醒select ...
newbuding 发表于 2010-04-16 13:58



pipe单进程应该是没有问题的,不过LZ的测试代码写的有问题。
write以后,select确实可以被唤醒。第一次是返回-1,然后循环,第二次返回1,然后去做read。
但是这里的read是一个循环,读走一次返回1,接着继续读,被阻塞了,下面的.没机会打印出来。
可以在pipe之后加上
unsigned long ul = 1;
ioctl(main_pipe[0], FIONBIO, &ul);
将读管道调成非阻塞模式,就可以打印出.来了。

论坛徽章:
0
6 [报告]
发表于 2010-04-17 12:44 |只看该作者
回复 5# w_anthony
谢谢楼上的。

论坛徽章:
0
7 [报告]
发表于 2010-04-17 21:37 |只看该作者
pipe(),一个进程当然没问题,而且楼主的用法stevens的书里也用过,不过楼主的代码阻塞在read()上了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP