免费注册 查看新帖 |

Chinaunix

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

[Linux] {顶置是一种态度} linux fifo 做客户/服务通信的问题,求规避 [复制链接]

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-02-23 22:27 |只看该作者 |倒序浏览
使用命名管道fifo来实现客户/服务端程序通信时,服务端阻塞读取来自客户端的数据
  1.    
  2.      //服务端循环收取数据
  3.     while (read(fd, buf, 4096) != -1) {
  4.         printf("服务端收到数据: %s\n", buf);
  5.         memset(buf, 0, strlen(buf));
  6.     }   
复制代码
当客户端关闭了管道的写端,此时read一直返回了0, 这样cpu就一直处于忙碌状态(因为没有阻塞)
有什么办法可以做到让 read 在没有数据可读的时候保持阻塞呢?

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
2 [报告]
发表于 2014-02-24 11:42 |只看该作者
本帖最后由 timespace 于 2014-02-24 12:10 编辑

xxx_fifo写端是多个客户端共享的,为了全部客户端关闭写端时,不收到EOF,可以在服务端执行“dummyfd = open(xxx_fifo, O_WRONLY)”

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
3 [报告]
发表于 2014-02-24 19:28 |只看该作者
回复 2# timespace


    服务端是用作读端的,用 O_WRONLY 不行呀!

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
4 [报告]
发表于 2014-02-24 19:36 |只看该作者
回复 3# socay2
服务端再次用只写打开一次,不用这个fd就可以了,然后服务端就不会收到EOF




   

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
5 [报告]
发表于 2014-02-24 19:45 |只看该作者
rd_fd = open(fifo_name, O_RDONLY); //正常读取处理数据
wd_fd = open(fifo_name, O_WRONLY); // 仅作为占位使用,可以避免所有客户端关闭时,read(rd_fd, ...)返回0

....
while ((read(rd_fd, ...) != -1) {
// 但愿明白我意思了吧
}

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
6 [报告]
发表于 2014-02-24 23:35 |只看该作者
回复 5# timespace


    大牛过招,就是不一样。
    多谢指点! {:3_189:}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP