popen/pclose的替代品?

Joe*_*Joe 5 c process popen

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

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

有没有办法让我模仿popen/pclose类型的行为,除了保证捕获进程结束"事件"和结果返回代码的方式?如何使用pclose避免固有的竞争条件并终止已启动的进程?

Wil*_*ell 3

分叉/执行/等待

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

  • 由于 popen 在没有 fork 的 Windows 上可用,因此它显然并不总是包装器。 (4认同)
  • 好的:我明白了。这段代码效果很好。我的旧代码与 popen/pclose 效果很好。效果不佳的是隐藏的 SIGCHLD 处理程序,它隐藏在我继承的公共代码中。哦,快点。我基本上是在与那个处理程序竞争(它只是简单地调用 waitpid(-1,...)。学到的教训:阅读所有手册页,不要假设任何事情! (3认同)