【发布时间】:2018-08-25 09:03:29
【问题描述】:
类似于problem asked a while ago on kernel 3.x,但我在 4.9.37 看到它。
命名的 fifo 是使用 mkfifo -m 0666 创建的。在读取端它是用
int fd = open(FIFO_NAME, O_RDONLY | O_NONBLOCK);
生成的fd 被传递到对select() 的调用中。一切正常,直到我运行echo >> <fifo-name>。
现在fd 在select() 返回之后出现在read_fds 中。 fd 上的 read() 将返回一个字节的数据。到现在为止还挺好。
下次调用select() 并返回时,fd 仍会出现在read_fds 中,但read() 将始终返回零含义而没有数据。实际上,读取端将消耗 100% 的处理器容量。这与引用问题所观察到的问题完全相同。
有人遇到过同样的问题吗?以及如何正确解决或解决它?
我想如果我关闭fifo的读取端,然后再次打开它,它会正常工作。这可能没问题,因为我们没有发送大量数据。虽然这不是一个好的或一般的解决方法。
【问题讨论】:
-
看到一篇关于竞态条件的文章。将查看是否相关:github.com/angrave/SystemProgramming/wiki/…
标签: c linux select named-pipes nonblocking