我正在使用execv
开始一个进程并让它写入文件。我同时启动一个监视文件的线程,以便使用stat.st_size
使其大小不超过某个限制。现在,当达到限制时,我waitpid
用于子进程,但这会引发错误,我在后台启动的进程变成了僵尸。当我使用主线程中的相同waitpid
停止时,该过程将被杀死而不会变成僵尸。有什么想法吗?
编辑:errno
为10,waitpid
返回-1。这是在Linux平台上。
答案 0 :(得分:1)
如果没有代码,这很难调试,但errno
10是ECHILD
。
根据手册页,返回如下:
ECHILD
(适用于waitpid()
或waitid()
)pid
(waitpid()
)或idtype
和id
指定的流程(waitid()
)不存在或不是调用进程的子进程。 (如果SIGCHLD
的操作设置为SIG_IGN
,这可能发生在自己的孩子身上。另请参阅有关线程的Linux Notes部分。)
简而言之,您指定的pid
不是调用waitpid()
的进程的子进程(或者不再是,因为它已终止)。
请注意括号部分:
"如果SIGCHLD
的操作设置为SIG_IGN
" ,则可能会对自己的孩子造成这种情况 - 如果您为SIGCHLD
SIG_IGN
设置信号处理程序,则wait
会自动有效完成,因此waitpid
无法正常工作孩子已经终止(不会经历僵尸状态)。
"另请参阅有关线程的Linux Notes部分。" - 在Linux中,线程本质上是进程。现代linux将允许一个线程等待其他线程的子节点(假设它们在同一个线程组中 - 广泛地是父进程)。如果您使用2.4之前的Linux,则情况并非如此。有关详细信息,请参阅__WNOTHREAD
上的文档。
我猜测线程是一个红色的鲱鱼,问题实际上是信号处理程序,因为这符合你的声明'该过程在没有成为僵尸的情况下被杀死。&# 39;