【发布时间】:2018-10-18 11:09:54
【问题描述】:
这里有个奇怪的问题。
我编写了一些 C++ 代码,使用 popen(3)、read(3) 和 pclose(3) 来运行各种 shell 命令、解析它们的输出并做一些其他的事情。该程序似乎运行良好。
然后我将一些代码提取到一个共享库中,并尝试从在 Mono 下运行的 C# 程序中使用它。现在 C++ 代码根本不起作用。
在GDB中运行代码,貌似pclose(3)always无条件返回-1,而不是子进程的real退出码。
看着strace,似乎wait4(2) 以ECHILD 失败。而且,据我所知,之所以这样做,是因为 SIGCHLD 被传递到 Mono 的其他线程之一,该线程立即进行了几次 wait4(2) 调用,然后继续它的一天。
做一些谷歌搜索,似乎内核随机选择了一个线程来发送SIGCHLD。 (换句话说,在多线程程序中,保证总是选择“错误”的线程。)
显然,我无法控制 Mono 运行时决定做什么。那么如何调用外部进程并可靠地获取它们的退出代码呢?
【问题讨论】:
-
在这里被报告给 Mono,他们关闭为“解析为 FEATURE”。 bugzilla.xamarin.com/show_bug.cgi?id=21818
-
...然后决定在三个月后改变它? github.com/mono/mono/issues/6200
标签: c++ linux process exit-code