Python Popen.waitpid 返回 “[Errno 10] 没有子进程”

2 投票
1 回答
1689 浏览
提问于 2025-04-16 01:12

我有一个能正常工作的Python脚本,它会执行一个外部命令,并调用 Popen.communicate()。但是,当我从一个C程序中调用这个脚本时,它在 os.waitpid() 这一步失败了,错误信息是 "[Errno 10] No child processes"。这是为什么呢?

这看起来像是 Python中的一个特定错误,不过我并没有使用线程。

这个C程序会进行分叉(fork),然后改变它的用户ID(UID)和组ID(GID),接着调用 setsid(),最后用 execle() 来执行("/bin/sh -c /python/script")。

1 个回答

1

在我的情况中,问题是C程序忽略了SIGCHLD这个信号。因为被忽略的信号会被子进程继承,所以Python进程也忽略了这个信号,这导致waitpid()函数无法正常工作。

解决办法:在C程序中,如果你之前忽略了某个信号,在创建子进程后要把这个信号的处理方式设置回默认值SIG_DFL

撰写回答