2015-05-04 64 views
1

我开始使用execv并让它写入文件的过程。我使用stat.st_size同时启动一个线程来监视文件,使其大小不超过某个限制。现在,当限制被击中时,I waitpid用于子进程,但是这会引发错误,并且我在后台启动的进程变成僵尸。当我在主线程中使用相同的waitpid来停止时,该进程会被杀死而不会成为僵尸。有任何想法吗?waitpid为子进程未成功

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

+0

“但是这会抛出一个错误...”,那个错误会是...什么?包括错误代码和所有相关消息传递*逐字*在您发布的问题。可能还包括平台信息。 – WhozCraig

+0

waitpid返回-1,errno设置为10. errno似乎表明子进程不存在。但似乎并非如此,因为我能够用ps ax来看待这个过程。操作系统是Linux。 – user1295872

+0

这将在*评论*。这些信息属于你发布的问题*无论如何,也许是关于“Linux Notes”[在'waitpid'文档中]的部分(http://linux.die。net/man/2/waitpid)可能有关系。 – WhozCraig

回答

1

这是很难无代码调试,但errno 10是ECHILD

%的人页面,这将返回如下:

ECHILD(用于waitpid()waitid())由pidwaitpid())或idtypeidwaitid())指定的进程不存在或不是一个呼叫过程的孩子。 (发生这种情况的一个自己的孩子,如果为SIGCHLD的操作设置为SIG_IGN。另请参见有关线程Linux的注释部分。)

总之,你指定pid不是过程调用的孩子waitpid()(或不再是,也许是因为它已经终止)。

注意括号部分:

  • “如果SIGCHLD的操作设置为SIG_IGN造成这种情况的一个自己的孩子” - 如果你设置了一个信号处理器为SIGCHLDSIG_IGNwait有效地自动完成,因此waitpid将无法​​正常工作,因为孩子已经终止(不会经历僵尸状态)。

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

我猜线程的是一个红色的鲱鱼,这个问题实际上是信号处理程序,因为这与你的说法相符“的过程中被杀害,而没有变成一个僵尸。”

+0

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

相关问题