等待子进程的waitpid函数未成功

4
我使用execv启动一个进程,并让它写入文件。同时,我启动一个线程来监视该文件,以确保其大小不超过特定限制,使用stat.st_size。现在,当达到限制时,我使用waitpid等待子进程,但是这会抛出错误,导致我在后台启动的进程成为僵尸进程。当我从主线程使用相同的waitpid停止时,进程被杀死而不会成为僵尸进程。有什么想法吗?
编辑:错误码errno是10,waitpid返回-1。这是在Linux平台上的情况。

但是这会引发一个错误...那个错误会是什么?请在您发布的问题中包含错误代码和所有相关消息逐字逐句。最好也包括平台信息。 - WhozCraig
waitpid返回-1,errno设置为10。errno似乎表明子进程不存在。但是这似乎并不是事实,因为我能够通过ps ax看到该进程。操作系统是Linux。 - user1295872
那应该是在注释中。那个信息应该放在你发布的问题中。无论如何,也许waitpid的文档中的“Linux注意事项”部分可能相关。 - WhozCraig
谢谢指出。所以如果我使用选项_WALL,我应该能够等待由主线程创建的子进程。我编辑了问题以包括错误信息。 - user1295872
快速查看 /usr/include/asm-generic/errno-base.h,可以看到 10 表示 ECHILD(没有子进程)。(您可以使用 strerror_r(3) 将 errno 转换为字符串)。请查看 waitpid(2) 手册以获取更多信息。 - RTLinuxSW
请注意:"exec() 函数族会使用新的进程镜像替换当前进程镜像。" 你具体是如何启动子进程的呢? - hookenz
1个回答

3

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

根据手册,返回如下:

ECHILD(对于waitpid()waitid())由pid指定的进程(waitpid())或idtypeidwaitid())不存在或不是调用进程的子进程。 (如果SIGCHLD的操作设置为SIG_IGN,这可能会发生自己的子项。另请参见有关线程的Linux注释部分。)

简而言之,您指定的pid不是调用waitpid()的进程的子进程(或者不再是,可能因为它已经终止)。

请注意括号中的部分:

  • "如果SIGCHLD的操作设置为SIG_IGN,这可能会发生自己的子项" - 如果您为SIGCHLD设置了信号处理程序以SIG_IGN,则等待实际上是自动完成的,因此waitpid不起作用,因为子项已经终止(不会进入僵尸状态)。

  • "另请参见有关线程的Linux注释部分。" - 在Linux中,线程本质上是进程。现代Linux将允许一个线程等待其他线程的子项(前提是它们在同一线程组中 - 广义父进程)。如果您使用的是2.4之前的Linux,则情况并非如此。有关详细信息,请参阅__WNOTHREAD文档。

我猜线程可能是一个误导,问题实际上是信号处理程序,因为这符合您的说法'the process is killed without becoming a zombie.'


我没有为SICHLD设置信号处理程序,所以那不应该是问题所在。我正在使用2.6内核,它应该隐式允许我的线程等待从主线程创建的进程。但事实并非如此。我设置了waitpid的__WALL和__WCLONE选项,但无济于事。我会继续探索并回复您。感谢您的建议。 - user1295872

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接