阻塞和非阻塞打开命名linux 设置管道非阻塞有什么区别吗

没有更多推荐了,
不良信息举报
举报内容:
进程间通信系列(7)匿名管道和命名管道异同
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 140, 距离下一级还需 60 积分
论坛徽章:0
本帖最后由 yyangh 于
19:05 编辑
情况是这样----
主进程:产生子进程执行任务。
子进程:执行完任务后返回结果给主进程。
我用命名管道的方式将子进程产生的信息传递给主进程,我希望主进程只等待子进程10秒,超过10秒,主进程不再等待子进程的结果返回,继续执行下面的任务。
出现这样的的问题:
如果用阻塞方式:主进程要一直等所有子进程结束后,他才能结束,这样可能导致因为子进程任务卡死,主进程也跟着卡死,这个不能允许。
如果用非阻塞方式:主进程做一个循环(这个循环持续10秒),不断的读取管道,看是否有新的内容写入。但是现在的问题是---在主进程没有结束的情况下,子进程open管道时就提示错误:No such device or address。
我该如果解决这个矛盾的问题呢?
相关代码-----
& && &&&unlink(FIFO);
& & & & if(mkfifo(FIFO,0666) == -1 )
& & & & & & & & printf(&Create pipe failed. \n&);
& && && && && & exit(1);
& && && &for(i=0;i&30;i++)
& && && &{
& && && && && &&&.......................产生30个子进程
& && && & }
& && &&&char buff[600];
& && &&&int s=0;
& & & & 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);
...........执行部分
//向管道返回结果:
& && && && && && && && && && & 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
这是LZ自己在做测试吧? 怎么能这样循环读呢? 不妥,建议select。
白手起家, 积分 125, 距离下一级还需 75 积分
论坛徽章:0
如果管道没有打开读,而只是打开写的话,就是产生错误的No such device or address。
家境小康, 积分 1058, 距离下一级还需 942 积分
论坛徽章:0
& & 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)
白手起家, 积分 140, 距离下一级还需 60 积分
论坛徽章:0
& & 可以做到等待10秒吗?
白手起家, 积分 140, 距离下一级还需 60 积分
论坛徽章:0
& & 这样是可以,但是会出现一个问题,就是如果子进程超过10秒后写入,就会一直阻塞在那里不退出,而此时主进程已经退出了,而子程就永远没有退出的机会了。
家境小康, 积分 1058, 距离下一级还需 942 积分
论坛徽章:0
本帖最后由 zzyong08 于
09:51 编辑
& & 子进程是读写方式打开的,就算父进程(读进程)退出,子进程的写也不会阻塞
白手起家, 积分 140, 距离下一级还需 60 积分
论坛徽章:0
& & 这个确实是允许,我也试了,但是和我之前描述的一样,同样会报找不到设备那个错误。
家境小康, 积分 1058, 距离下一级还需 942 积分
论坛徽章:0
你再检查一下,我这边测试open没有问题,你还是open的问题吗?
家境小康, 积分 1058, 距离下一级还需 942 积分
论坛徽章:0
fd = open(FIFO, O_WRONLY | O_RDONLY | O_NONBLOCK )&&== -1
你的代码里这样写,有问题,最后结果是fd等于0,标准输入,write标准输入,是不是这儿的问题呀!
北京盛拓优讯信息技术有限公司. 版权所有 京ICP备号 北京市公安局海淀分局网监中心备案编号:22
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处使用CallNamedPipe写入一个命名管道,导致阻塞了,为何?
[问题点数:40分,结帖人myerrory]
使用CallNamedPipe写入一个命名管道,导致阻塞了,为何?
[问题点数:40分,结帖人myerrory]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年9月 VC/MFC大版内专家分月排行榜第一2013年8月 VC/MFC大版内专家分月排行榜第一
2012年2月 VC/MFC大版内专家分月排行榜第二2011年3月 VC/MFC大版内专家分月排行榜第二2011年2月 VC/MFC大版内专家分月排行榜第二
匿名用户不能发表回复!|没有更多推荐了,
不良信息举报
举报内容:
使用命名管道的OVERLAPPED方式实现非阻塞模式编程
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
点击阅读原文
我要该,理由是:
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)

我要回帖

更多关于 linux 设置管道非阻塞 的文章

 

随机推荐