我不太了解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;
}
这个程序一直执行到最后但根据我的理解它不应该。我的上述推理出了什么问题?
答案 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 选项参数无效。