【问题标题】:waitpid for child process not succeeding子进程的waitpid不成功
【发布时间】:2015-05-04 14:31:45
【问题描述】:

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

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

【问题讨论】:

  • "但是这会引发一个错误......" 那个错误会是......什么?在您发布的问题中包含错误代码和所有相关消息逐字。也可以包括平台信息。
  • waitpid 返回 -1,errno 设置为 10。errno 似乎表明子进程不存在。但情况似乎并非如此,因为我可以用 ps ax 看到这个过程。操作系统是 linux。
  • 这将在 comment 中。该信息属于您发布的问题。无论如何,“Linux 笔记”in the documentation of waitpid 部分可能是相关的。
  • 感谢您指出这一点。因此,如果我使用选项 _WALL,我应该能够等待由主线程创建的子进程。我编辑了问题以包含错误信息。
  • 快速查看 /usr/include/asm-generic/errno-base.h 显示 10 是 ECHILD(无子进程)。 (您可以使用 strerror_r(3) 将 errno 转换为字符串)。查看 waitpid(2) 手册页了解更多信息。

标签: c linux process pthreads waitpid


【解决方案1】:

这在没有代码的情况下很难调试,但是errno 10 是ECHILD

根据手册页,返回如下:

ECHILD(对于waitpid()waitid()pidwaitpid())或idtypeidwaitid())指定的进程不存在或不是调用过程。 (如果SIGCHLD 的操作设置为SIG_IGN,则可能发生在自己的孩子身上。另请参阅有关线程的Linux 注释部分。)

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

注意括号部分:

  • “如果SIGCHLD 的操作设置为SIG_IGN,这可能发生在自己的孩子身上” - 如果您已经为SIGCHLD 设置了信号处理程序以是SIG_IGNwait 是自动完成的,因此waitpid 将不起作用,因为孩子已经终止(不会进入僵尸状态)。

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

我猜线程的东西是一个红鲱鱼,问题实际上是信号处理程序,因为这符合你的说法'进程被杀死而不成为僵尸。' p>

【讨论】:

  • 我没有为 SICHLD 设置信号处理程序。所以这不应该是问题。我使用的是 2.6 内核,它应该隐式允许我的线程等待从主线程创建的进程。但这并没有发生。我将 __WALL 和 __WCLONE 选项设置为 waitpid 无济于事。我会继续调查并回复你。不过感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 2020-01-15
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
相关资源
最近更新 更多