【问题标题】:Alternatives to popen/pclose?popen/pclose 的替代品?
【发布时间】:2010-11-16 10:50:10
【问题描述】:

我正在编写一个必须执行其他外部进程的程序;现在程序通过 popen 启动进程的命令行,获取任何输出,然后通过 pclose 获取退出状态。

然而,正在发生的是,对于快速运行的进程(例如,启动的进程很快出错),pclose 调用无法获得退出状态(pclose 返回 -1,errno 为 ECHILD)。

我有没有办法模仿 popen/pclose 类型的行为,除非以保证捕获进程结束“事件”和结果返回码的方式?如何避免 pclose 的固有竞争条件和启动进程的终止?

【问题讨论】:

    标签: c process popen


    【解决方案1】:

    您可以使用 vfork() 和 execv()。

    【讨论】:

      【解决方案2】:

      分叉/执行/等待

      popen 只是一个用于简化 fork/exec 调用的包装器。如果要获取子节点的输出,则需要创建一个管道,调用 fork,将子节点的文件描述符复制到管道,然后执行。父级可以读取管道的输出并调用等待来获取子级的退出状态。

      【讨论】:

      • 由于 popen 在没有 fork 的 windows 上可用,显然它并不总是一个包装器。
      • 我重写了我的代码来执行此操作(fork/exec/dup/etc.),现在我在 waitpid(...) 返回 -1/errno=ECHILD 时遇到间歇性故障。废话。
      • 好的:我想通了。这段代码很好用。我的带有 popen/pclose 的旧代码效果很好。没有很好用的是隐藏在我继承的公共代码中的隐藏的 SIGCHLD 处理程序。哦,快点。我基本上是在与那个处理程序竞争(它只是调用 waitpid(-1,...)。吸取的教训:阅读所有手册页,不要假设任何事情!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 2014-02-12
      • 1970-01-01
      • 2018-07-31
      相关资源
      最近更新 更多