免费注册 查看新帖 |

Chinaunix

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

命名管道非阻塞问题!!! [复制链接]

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

情况是这样----
主进程:产生子进程执行任务。
子进程:执行完任务后返回结果给主进程。

我用命名管道的方式将子进程产生的信息传递给主进程,我希望主进程只等待子进程10秒,超过10秒,主进程不再等待子进程的结果返回,继续执行下面的任务。


出现这样的的问题:

如果用阻塞方式:主进程要一直等所有子进程结束后,他才能结束,这样可能导致因为子进程任务卡死,主进程也跟着卡死,这个不能允许。

如果用非阻塞方式:主进程做一个循环(这个循环持续10秒),不断的读取管道,看是否有新的内容写入。但是现在的问题是---在主进程没有结束的情况下,子进程open管道时就提示错误:No such device or address。


我该如果解决这个矛盾的问题呢?

相关代码-----

主进程:

main()
{
        unlink(FIFO);
        if(mkfifo(FIFO,0666) == -1 )
        {
                printf("Create pipe failed. \n");
                exit(1);
        }
         int i;
         for(i=0;i<30;i++)
         {
                 .......................产生30个子进程
          }
        char buff[600];
        int s=0;
        int fd;
        for(s = 0;s<1000000;s++)
        {

                if ( (fd=open(FIFO,O_RDONLY | O_NONBLOCK) ) == -1  )
                {
                        printf("open failed \n");
                        exit(-1);

                }
                read(fd, buff, sizeof(buff) );
                printf("buff:%s\n",buff);
                close(fd);
                usleep(1);
        }

}

子进程:
child()
{
...........执行部分


//向管道返回结果:
                               if (fd = open(FIFO, O_WRONLY | O_RDONLY | O_NONBLOCK )  == -1)           --------------执行到这一步报错了。。。。。。
                                {
                                        perror("open pipe");
                                }
                                else if (write( fd, err_buff, strlen(err_buff) )  == -1 )
                                {
                                        perror("write pipe");
                                        close(fd);
                                }
                                else
                                {
                                        close(fd);
                                }
}

论坛徽章:
0
2 [报告]
发表于 2010-08-23 22:05 |只看该作者
这是LZ自己在做测试吧? 怎么能这样循环读呢? 不妥,建议select。

论坛徽章:
0
3 [报告]
发表于 2010-08-23 22:15 |只看该作者
如果管道没有打开读,而只是打开写的话,就是产生错误的No such device or address。

论坛徽章:
0
4 [报告]
发表于 2010-08-24 09:11 |只看该作者
回复 1# yyangh


    ENXIO  O_NONBLOCK  |  O_WRONLY  is  set, the named file is a FIFO and no process has the file open for reading.
              Or, the file is a device special file and no corresponding device exists.

    fd = open(FIFO, O_WRONLY | O_RDONLY | O_NONBLOCK),改成  fd = open(FIFO, O_RDWR)

论坛徽章:
0
5 [报告]
发表于 2010-08-24 09:39 |只看该作者
回复 2# lenky0401


    可以做到等待10秒吗?

论坛徽章:
0
6 [报告]
发表于 2010-08-24 09:46 |只看该作者
回复 4# zzyong08


    这样是可以,但是会出现一个问题,就是如果子进程超过10秒后写入,就会一直阻塞在那里不退出,而此时主进程已经退出了,而子程就永远没有退出的机会了。

论坛徽章:
0
7 [报告]
发表于 2010-08-24 09:49 |只看该作者
本帖最后由 zzyong08 于 2010-08-24 09:51 编辑

回复 6# yyangh

   
    子进程是读写方式打开的,就算父进程(读进程)退出,子进程的写也不会阻塞

论坛徽章:
0
8 [报告]
发表于 2010-08-24 09:51 |只看该作者
回复 7# zzyong08


    这个确实是允许,我也试了,但是和我之前描述的一样,同样会报找不到设备那个错误。

论坛徽章:
0
9 [报告]
发表于 2010-08-24 10:00 |只看该作者
你再检查一下,我这边测试open没有问题,你还是open的问题吗?

论坛徽章:
0
10 [报告]
发表于 2010-08-24 10:03 |只看该作者
fd = open(FIFO, O_WRONLY | O_RDONLY | O_NONBLOCK )  == -1

你的代码里这样写,有问题,最后结果是fd等于0,标准输入,write标准输入,是不是这儿的问题呀!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP