Chinaunix
标题:
{顶置是一种态度} linux fifo 做客户/服务通信的问题,求规避
[打印本页]
作者:
socay2
时间:
2014-02-23 22:27
标题:
{顶置是一种态度} linux fifo 做客户/服务通信的问题,求规避
使用命名管道fifo来实现客户/服务端程序通信时,服务端阻塞读取来自客户端的数据
//服务端循环收取数据
while (read(fd, buf, 4096) != -1) {
printf("服务端收到数据: %s\n", buf);
memset(buf, 0, strlen(buf));
}
复制代码
当客户端关闭了管道的写端,此时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