【问题标题】:pclose() won't give me the process exit codepclose() 不会给我进程退出代码
【发布时间】: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 运行时决定做什么。那么如何调用外部进程并可靠地获取它们的退出代码呢?

【问题讨论】:

标签: c++ linux process exit-code


【解决方案1】:

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

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

如果waitpid()带有子进程ID返回-1pclose()也返回-1

如果您在等待任意子进程而不是仅等待自己创建的子进程的其他线程中破坏了代码,则可能会发生这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-17
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    相关资源
    最近更新 更多