waitpid for child进程没有成功

时间:2015-05-04 14:31:46

标签: c linux process pthreads waitpid

我正在使用execv开始一个进程并让它写入文件。我同时启动一个监视文件的线程,以便使用stat.st_size使其大小不超过某个限制。现在,当达到限制时,我waitpid用于子进程,但这会引发错误,我在后台启动的进程变成了僵尸。当我使用主线程中的相同waitpid停止时,该过程将被杀死而不会变成僵尸。有什么想法吗?

编辑:errno为10,waitpid返回-1。这是在Linux平台上。

1 个答案:

答案 0 :(得分:1)

如果没有代码,这很难调试,但errno 10是ECHILD

根据手册页,返回如下:

  

ECHILD(适用于waitpid()waitid()pidwaitpid())或idtypeid指定的流程(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;