我开始使用execv
并让它写入文件的过程。我使用stat.st_size
同时启动一个线程来监视文件,使其大小不超过某个限制。现在,当限制被击中时,I waitpid
用于子进程,但是这会引发错误,并且我在后台启动的进程变成僵尸。当我在主线程中使用相同的waitpid
来停止时,该进程会被杀死而不会成为僵尸。有任何想法吗?waitpid为子进程未成功
编辑:errno
是10和waitpid
返回-1。这是在Linux平台上。
我开始使用execv
并让它写入文件的过程。我使用stat.st_size
同时启动一个线程来监视文件,使其大小不超过某个限制。现在,当限制被击中时,I waitpid
用于子进程,但是这会引发错误,并且我在后台启动的进程变成僵尸。当我在主线程中使用相同的waitpid
来停止时,该进程会被杀死而不会成为僵尸。有任何想法吗?waitpid为子进程未成功
编辑:errno
是10和waitpid
返回-1。这是在Linux平台上。
这是很难无代码调试,但errno
10是ECHILD
。
%的人页面,这将返回如下:
ECHILD
(用于waitpid()
或waitid()
)由pid
(waitpid()
)或idtype
和id
(waitid()
)指定的进程不存在或不是一个呼叫过程的孩子。 (发生这种情况的一个自己的孩子,如果为SIGCHLD
的操作设置为SIG_IGN
。另请参见有关线程Linux的注释部分。)
总之,你指定pid
不是过程调用的孩子waitpid()
(或不再是,也许是因为它已经终止)。
注意括号部分:
“如果SIGCHLD
的操作设置为SIG_IGN
造成这种情况的一个自己的孩子” - 如果你设置了一个信号处理器为SIGCHLD
是SIG_IGN
,wait
有效地自动完成,因此waitpid
将无法正常工作,因为孩子已经终止(不会经历僵尸状态)。
“另请参阅有关线程的Linux注释部分。 - 在Linux中,线程本质上就是进程。现代linux将允许一个线程等待其他线程的子进程(只要它们在同一个线程组中 - 大致为父进程)。如果您在2.4之前使用Linux,则情况并非如此。有关详细信息,请参阅__WNOTHREAD
上的文档。
我猜线程的是一个红色的鲱鱼,这个问题实际上是信号处理程序,因为这与你的说法相符“的过程中被杀害,而没有变成一个僵尸。”
我没有为SICHLD设置信号处理程序。所以这不应该是问题。我正在使用2.6内核,它应该隐式允许我的线程等待主线程创建的进程。但是这并没有发生。我为waitpid设置__WALL和__WCLONE选项无济于事。我会继续探索并回复你。谢谢你的建议。 – user1295872
“但是这会抛出一个错误...”,那个错误会是...什么?包括错误代码和所有相关消息传递*逐字*在您发布的问题。可能还包括平台信息。 – WhozCraig
waitpid返回-1,errno设置为10. errno似乎表明子进程不存在。但似乎并非如此,因为我能够用ps ax来看待这个过程。操作系统是Linux。 – user1295872
这将在*评论*。这些信息属于你发布的问题*无论如何,也许是关于“Linux Notes”[在'waitpid'文档中]的部分(http://linux.die。net/man/2/waitpid)可能有关系。 – WhozCraig