你对c编程有点新鲜。我有以下代码片段,基本上程序需要检查子进程的状态,父进程等待子进程终止,然后打印“子进程终止”。但我尝试了WNOHANG,但不知怎的,我的第二次检查不起作用/或者我不能阻止孩子的过程。伙计们好吗?提前谢谢。
代码:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
int pid;
int ppid;
int status;
pid=vfork();
pid_t return_pid = waitpid(pid, &status, WNOHANG);
if (pid<0) {
printf("\n Error ");
exit(1);
} else if (pid==0) {
printf("\n Hello I am the child process ");
printf("\n My pid is %d %d ",return_pid, getpid());
exit(0);
} else if (return_pid == pid) {
printf("child is finished %d %d", return_pid, pid);
exit(0);
} else {
printf("\n Hello I am the parent process %d %d", return_pid, pid);
printf("\n My actual pid is %d %d \n ",return_pid, getpid());
exit(1);
}
}
答案 0 :(得分:2)
我想知道你的waitpid是否位于错误的位置。检查man 2 wait
并阅读pid的参数代表什么
pid参数指定要等待的子进程集。如果pid为-1,则调用将等待任何子进程。 如果pid为0,则呼叫等待任何孩子 调用者的进程组中的进程。如果pid大于零,则调用将等待进程id为pid的进程。如果pid小于-1,则呼叫等待任何 进程组id等于pid绝对值的进程。
对我来说,粗体文字表明孩子可能在等待自己? vfork的值将为孩子返回0。
此外,如果孩子没有退出,WNOHANG选项将导致waitpid立即返回,这意味着父母不会等待孩子完成。如果子进程已完成,则它将返回子进程的pid。