pclose() 不会给我进程退出代码

pclose() won't give me the process exit code

本文关键字:进程 退出 代码 pclose      更新时间:2023-10-16

我这里有一个奇怪的问题。

我编写了一些C++代码,使用popen(3)read(3)pclose(3)来运行各种 shell 命令、解析它们的输出以及做一些其他事情。该程序似乎运行良好。

然后,我将一些代码提取到共享库中,并尝试从在Mono下运行的C#程序中使用它。现在C++代码根本不起作用。

在 GDB 中运行代码,似乎pclose(3)总是无条件返回 -1 而不是子进程的真正退出代码。

strace,似乎wait4(2)ECHILD失败了。而且,据我所知,它之所以这样做,是因为SIGCHLD被传送到 Mono 的其他线程之一,该线程会立即执行几次wait4(2)调用,然后继续它的一天。

做一些谷歌搜索,内核似乎随机选择一个线程来发送SIGCHLD。(换句话说,在多线程程序中,保证始终选择"错误"的线程。

显然,我无法控制 Mono 运行时决定做什么。那么,如何调用外部进程并可靠地获取其退出代码呢?

pclose()从不从子进程返回真正的退出代码。

pclose而是将stat_loc参数的值返回到wait()调用。

在这种情况下,当waitpid()子进程 ID 返回-1时,pclose()也会返回-1

如果其他线程中的代码中断,这些代码等待任意子进程,而不是仅等待自行创建的子进程,则可能会发生这种情况。