- 论坛徽章:
- 0
|
本帖最后由 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);
}
} |
|