1

假设我通过popen(只读)从流程 PA 生成流程 PO。然后我pclose()将管道放在 PA 一侧。

在 PO 方面,我如何确定stdout是否仍然可用而不执行write()

请注意,我曾尝试在 PO 方面捕获 SIGPIPE,但无济于事。

更新:我尝试使用fstat(1, &buf)但没有成功。

更新:我需要通过 PO 检测这种情况的原因是我无法从 PA 访问 PO 的 PID(因此无法杀死它)。此外,我希望 PO 在 PA 的失败(即自行退出)时更加稳健。

解决方案:我继续使用socketpairfork. 试图控制一个过程popen被证明是一场噩梦(至少对我来说)。 非常感谢所有做出贡献的人!

4

2 回答 2

2

嗯... pclose() 应该在关闭管道之前等待 PO 完成。同时,PO 可以继续向管道末端写入至少 4192 字节(ulimit -p乘以 512),然后它应该简单地阻塞。

如果您想要更多控制权,也许您将不得不切换到 pipe()/fork()/dup2()/close()。如果这是您想要的,请告诉我,我会发布一些代码。

于 2009-11-16T21:16:40.533 回答
2

PA 是信息的消费者(因此它确实是 popen() 和 pclose() )。

PO 是提供者,因此是服务器 - 在这种情况下,它只知道它正在写入 stdout,但不能告诉 stdout 绑定到什么。所以在这种情况下,PO不应该对标准输出了解太多。

EOF 检测应该发生在 PA 程序中。

您能否发布更多关于为什么需要在 PO 中执行此操作的详细信息?

于 2009-11-16T21:23:34.623 回答