Chinaunix

标题: {顶置是一种态度} linux fifo 做客户/服务通信的问题,求规避 [打印本页]

作者: socay2    时间: 2014-02-23 22:27
标题: {顶置是一种态度} linux fifo 做客户/服务通信的问题,求规避
使用命名管道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 在没有数据可读的时候保持阻塞呢?
作者: timespace    时间: 2014-02-24 11:42
本帖最后由 timespace 于 2014-02-24 12:10 编辑

xxx_fifo写端是多个客户端共享的,为了全部客户端关闭写端时,不收到EOF,可以在服务端执行“dummyfd = open(xxx_fifo, O_WRONLY)”
作者: socay2    时间: 2014-02-24 19:28
回复 2# timespace


    服务端是用作读端的,用 O_WRONLY 不行呀!
作者: timespace    时间: 2014-02-24 19:36
回复 3# socay2
服务端再次用只写打开一次,不用这个fd就可以了,然后服务端就不会收到EOF




   
作者: timespace    时间: 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) {
// 但愿明白我意思了吧
}
作者: socay2    时间: 2014-02-24 23:35
回复 5# timespace


    大牛过招,就是不一样。
    多谢指点! {:3_189:}




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2