【发布时间】:2016-02-18 15:05:44
【问题描述】:
我已经打开了一个子进程,它输出包含一些状态信息的固定大小的结构。我的计划是有一个单独的线程从该进程的标准输出中读取数据,以便在数据到来时提取数据。
我必须定期检查一个标志以确保程序仍在运行,以便我可以干净地关闭,所以我必须将管道设置为非阻塞,并且只需运行一个循环将状态消息拼接在一起.
有没有一种规范的方式可以告诉 Linux“在超时之前读取全部内容或不读取任何内容”,这样我就可以检查我的标志,但我不必处理读取的样板文件结构件餐?
或者,有没有办法将数据推回管道?我可以尝试阅读整个内容,如果它在一切准备好之前超时,请将我拥有的内容推回并稍后再试一次。
我还写了我的 popen(所以我可以获取标准输入和标准输出,所以如果有帮助的话,我完全可以使用套接字而不是管道)。
【问题讨论】:
-
如果
struct小于PIPE_BUF,并且您在每次写入后刷新管道,I believe it should be atomic. -
fread负责这个 -
@ShadowRanger,struct 肯定比 PIPE_BUF 小,但我不能保证它全部写在一个调用中,所以我认为这破坏了原子性。
-
您是否看到了由非阻塞管道引起的实际错误,或者这更像是一个关于竞争条件可能性的理论问题?
-
@Matt 不,它现在工作正常,如果我有我正在考虑的 read_all_or_nothing 语义,代码会更干净。
标签: c++ linux sockets pipe posix