+ -
当前位置:首页 → 问答吧 → 命名管道非阻塞问题!!!

命名管道非阻塞问题!!!

时间:2010-08-23

来源:互联网

本帖最后由 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);
                                }
}

作者: yyangh   发布时间: 2010-08-23

这是LZ自己在做测试吧? 怎么能这样循环读呢? 不妥,建议select。

作者: lenky0401   发布时间: 2010-08-23

如果管道没有打开读,而只是打开写的话,就是产生错误的No such device or address。

作者: jiang1013nan   发布时间: 2010-08-23