为什么waitpid(-1,& status,0)没有暂停进程而没有任何子进程?

时间:2014-11-16 13:22:56

标签: c waitpid

我不太了解waitpid()函数。手册说:

The wait() system call suspends execution of the calling process until one of its children terminates. The call wait(&status) is equivalent to: waitpid(-1, &status, 0);

来源:http://manpages.ubuntu.com/manpages/raring/man2/wait.2.html

据我了解这一点:如果我有一个进程并且没有子进程那么会调用waitpid(-1, &status, 0)函数,那么进程应该挂起并且不会继续,因为没有子节点就永远不会有状态变化,所以进程只是挂在那里等待子进程改变状态,在这种情况下永远不会发生,但这种理解似乎是错误的,因为下面的代码不会挂在waitpid上( )功能。相反,它返回-1表示错误,这是合理的,因为没有任何子进程但是根据手册的理解,程序应该只挂在/在waitpid()函数中等待孩子改变状态。但是没有子节点,因此没有状态更改,因此它应该挂在waitpid()函数中并等待等待。下面的代码永远不会到达printf()语句,而是到达printf()函数。

此代码仅用于演示目的:

#include <sys/wait.h>
#include <sys/types.h>
#include <stdio.h>

int main() {
  int status;
  pid_t pid;
  pid = waitpid(-1, &status, 0);
  printf("%i\n", (int) pid); // pid returns -1
  return 0;
}

这个程序一直执行到最后但根据我的理解它不应该。我的上述推理出了什么问题?

2 个答案:

答案 0 :(得分:2)

显然,意图是,通过返回-1,表示没有孩子可以等待(在某种意义上,所有孩子终止)。

答案 1 :(得分:0)

检查errno以找出waitpid返回-1的原因:

  

ECHILD (对于wait())调用进程没有任何unwaited-for                孩子。

     

ECHILD (对于waitpid()或waitid())由pid指定的进程              (waitpid())或idtype和id(waitid())不存在或不存在              呼叫过程的孩子。 (这可能发生在一个人自己的身上              如果SIGCHLD的操作设置为SIG_IGN,则为child。另见              关于线程的Linux Notes部分。)

     

EINTR WNOHANG未设置且未阻止信号或SIGCHLD为              抓住;见信号(7)。

     

EINVAL 选项参数无效。