gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:12:48 24 4
gpt4 key购买 nike

我遇到了一个奇怪的问题。

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

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

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

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

通过 Google 搜索,内核似乎随机选择了一个线程来将 SIGCHLD 发送到。 (换句话说,在多线程程序中,保证总是选择“错误的”线程。)

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

最佳答案

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

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

在某些情况下,当带有子进程 ID 的 waitpid() 返回 -1 时,pclose() 返回 - 1 也是如此。

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

关于c++ - pclose() 不会给我进程退出代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52888613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com