子进程的 waitpid 未成功

2024-02-19

我正在使用启动一个进程execv并让它写入文件。我同时启动一个线程来监视文件,以便它的大小不超过使用的特定限制stat.st_size。现在,当达到极限时,我waitpid对于子进程,但这会引发错误,并且我在后台启动的进程变成僵尸进程。当我用同样的方法停止时waitpid从主线程来看,进程被杀死,但没有变成僵尸。有任何想法吗?

编辑:errno是 10 并且waitpid返回-1。这是在linux平台上的。


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

根据手册页,返回如下:

ECHILD (for waitpid() or waitid()) 指定的过程pid (waitpid()) or idtype and id (waitid()) 不存在或者不是调用进程的子进程。 (如果采取行动,这可能会发生在自己的孩子身上SIGCHLD被设定为SIG_IGN。另请参阅 Linux 注释中有关线程的部分。)

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

请注意括号部分:

  • “如果采取行动,这种情况也可能发生在自己的孩子身上SIGCHLD被设定为SIG_IGN"- 如果您已经设置了信号处理程序SIGCHLD to be SIG_IGN, the wait有效地自动完成,因此waitpid不会工作,因为孩子已经终止(不会经历僵尸状态)。

  • “另请参阅 Linux Notes 中有关线程的部分。”- 在Linux中,线程本质上是进程。现代Linux将允许一个线程等待其他线程的子线程(前提是它们位于同一个线程组中——广泛的父进程)。如果您使用 2.4 之前的 Linux,则情况并非如此。请参阅有关的文档__WNOTHREAD了解详情。

我猜线程的事情是一个红鲱鱼,问题实际上是信号处理程序,因为这符合你的说法“该进程被杀死,但没有变成僵尸。”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

子进程的 waitpid 未成功 的相关文章

随机推荐