pclose() 不会给我进程退出代码
pclose() won't give me the process exit code
我这里有一个奇怪的问题。
我编写了一些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
。
如果其他线程中的代码中断,这些代码等待任意子进程,而不是仅等待自行创建的子进程,则可能会发生这种情况。
相关文章:
- pclose() 不会给我进程退出代码
- 进程退出,返回值3221226356写入系统( "cls" )。(已解决)
- VSCode C++终端进程已终止,退出代码为:1
- Qt5 [make -snap] 无法正确编译:进程"/usr/bin/snap"代码 1 退出
- C++进程在 4.017 秒后退出,返回值3221225477
- CLion、MinGW 和 SDL2:进程已完成,退出代码为 -1073741515 (0xC0000135)
- 终端进程终止,退出代码为:1有什么方法可以修复它吗
- std::async 如果线程是从 DLL 创建的,则会阻止进程退出?
- 进程退出,返回值3221225477访问多维向量
- 子进程即使在父进程退出后也会运行
- 在 c++ 中,如何保证当进程退出或被杀死时执行某些代码?
- 使用Runtime.exec从Java运行进程-退出代码139
- 广播消息供所有进程退出 (MPI)
- 在 Linux 中父进程退出之前_保证_子进程被杀死需要什么?
- prctl(PR_SET_PDEATHSIG, SIGNAL) 在父线程退出时调用,而不是在父进程退出时调用
- 在分叉父进程退出后跳回子进程
- 进程退出,返回值3221226356
- Poco 异步通道不会在分叉进程退出时退出
- 进程退出时收到通知
- 进程退出和对线程的影响