我正在使用启动一个进程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(使用前将#替换为@)