命名管道非阻塞问题!!!
时间: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);
}
}
情况是这样----
主进程:产生子进程执行任务。
子进程:执行完任务后返回结果给主进程。
我用命名管道的方式将子进程产生的信息传递给主进程,我希望主进程只等待子进程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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28