我对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?
>
我做错了什么?
答案 0 :(得分:8)
父进程很可能已退出且不再存在。你可以在父母那里尝试一些延迟。
答案 1 :(得分:1)
&#39; init&#39; 这是在linux系统中运行的根进程有pid 1。
当进程的父级在其自身(即孩子)之前被终止时,该子进程将成为&#39; 进程并被根进程占用或正好在创建它的进程层次结构上方的进程(父进程)。
因此,这里它由在pid = 1的init下执行并执行。 因此,请延迟您的父流程以获得解决方案。
答案 2 :(得分:0)
就像其他人提到的那样,看起来子进程仍在执行时父进程已终止,从而使其(子进程)成为 orphan 。在退出前添加延迟可能会起作用。
但是,这样做的一种优雅方法是,父进程必须等待子进程终止。
这可以通过使用孩子的pid(waitpid()
返回的值)调用fork()
来实现。当控件退出此功能时,可以确保子进程已终止。另外,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);
}