[英]c fork's child ppid does not match parent's pid
我对 C 完全陌生。我尝试了以下代码,期望孩子的 ppid 与父母的 pid 匹配,但事实并非如此。
int main() {
int pid;
printf("I'm process with pid=%d\n", getpid());
switch (pid = fork()) {
case -1:
perror("fork");
exit(1);
case 0:
printf("I'm the child process: pid=%d, ppid=%d\n", getpid(), getppid());
break;
default:
printf("I'm the parent process: pid=%d, ppid=%d\n", getpid(), getppid());
break;
}
exit(0);
}
> gcc -o fork fork.c
> ./fork
I'm process with pid=16907
I'm the parent process: pid=16907, ppid=6604
I'm the child process: pid=16908, ppid=1 // <-- expected ppid=16907, why 1?
>
我做错了什么 ?
父进程很可能已经退出并且不再存在。 您可以尝试在父母中延迟一些。
'init'是在 linux 系统中运行的根进程,其 pid 为 1 。
当进程的父进程在其自身(即子进程)之前终止时,子进程将成为“孤儿”进程并被根进程或创建它的进程(父进程)的层次结构之上的进程占用。
因此,这里它被 pid = 1 的 init 占用并在其下执行。 因此,延迟您的父进程以寻求解决方案。
就像其他人提到的那样,看起来父进程已终止,而子进程仍在执行中,使其(子进程)成为孤儿。 在退出之前添加延迟可能会起作用。
但一种优雅的做法是,父进程必须等到子进程终止。
这可以通过使用子waitpid()
的 pid( fork()
返回的值waitpid()
调用waitpid()
来实现。 当控制权从这个函数出来时,你可以确定子进程已经终止。 此外, waitpid()
返回进程终止的状态。 根据它返回的状态,您可以了解正常/异常终止子进程。
这是执行此操作的代码:
int main() {
int pid;
int status = 0;
printf("I'm process with pid=%d\n", getpid());
switch (pid = fork()) {
case -1:
perror("fork");
exit(1);
case 0:
printf("I'm the child process: pid=%d, ppid=%d\n", getpid(), getppid());
break;
default:
waitpid(pid, &status, 0);
if(WIFEXITED(status)
{
printf("Normal termination of child process %d\n", pid);
}
else
{
printf("Abormal termination of child process %d\n", pid);
}
printf("I'm the parent process: pid=%d, ppid=%d\n", getpid(), getppid());
break;
}
exit(0);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.