【问题标题】:popen & status of a pipe管道的弹出和状态
【发布时间】:2009-11-16 20:50:33
【问题描述】:

假设我通过popen(只读)从流程 PA 生成流程 PO。然后我pclose() PA 那边的管道。

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

请注意,我已尝试在 PO 端捕获 SIGPIPE,但无济于事。

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

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

解决方案:我继续使用socketpairfork。试图通过popen 控制进程结果是一场噩梦(至少对我而言)。 非常感谢所有做出贡献的人!

【问题讨论】:

  • 为什么不能让 PO 通过管道发送它的 PID?
  • 您似乎真的在这里突破了 popen() 的极限。为什么不想走fork()等路线?
  • @Duck:我可以通过 STDOUT 发送 PID,但有两件事:1)另一边有更多逻辑,2)仍然 PO 不能自己提交 hara-kiri 知道 STDOUT 的状态管道。

标签: linux popen


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    您能否详细说明为什么需要在 PO 中执行此操作?

    【讨论】:

      猜你喜欢
      • 2010-11-16
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-13
      • 2012-10-15
      相关资源
      最近更新 更多