子进程打印错误的 ppid()
child process prints wrong ppid()
在这个程序中,为什么子进程打印错误的ppid()?
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
void childprocess()
{
printf("Child: Hi I am the child process\n");
printf("Child: My process id is %d\n", getpid());
printf("Child: My parent is %d\n", getppid());
printf("Child: I am exiting\n");
}
void parentprocess()
{
printf("Parent: Hi I am the parent process\n");
printf("Parent: My process id is %d\n", getpid());
printf("Parent: My parent is %d\n", getppid());
printf("Parent: I am exiting\n");
}
int main()
{
pid_t n = fork();
if(n<0)
{
perror("fork failed:");
exit(EXIT_FAILURE);
}
else if(n==0)
childprocess();
else
parentprocess();
}
输出:
Parent: Hi I am the parent process
Parent: My process id is 21550
Parent: My parent is 7452
Parent: I am exiting
Child: Hi I am the child process
Child: My process id is 21551
Child: My parent is 1810
Child: I am exiting
如果我重新执行。有时输出是我所期望的,有时是出乎意料的。
发现 reason.That 很愚蠢。 parent 首先结束,因此 child(孤儿)被 init 进程采用。
在我的例子中,它是进程 ID 为 1810 的 Upstart。
Upstart is an event-based replacement for the /sbin/init
确实,不能保证调度器会先调度子进程。父进程可能会在子进程 运行 之前终止。并且由于在 Linux 中每个进程都有一个父进程(交换进程除外),孤儿被分配给 init。
您可以添加一个wait()
以便父进程等待子进程。
在这个程序中,为什么子进程打印错误的ppid()?
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
void childprocess()
{
printf("Child: Hi I am the child process\n");
printf("Child: My process id is %d\n", getpid());
printf("Child: My parent is %d\n", getppid());
printf("Child: I am exiting\n");
}
void parentprocess()
{
printf("Parent: Hi I am the parent process\n");
printf("Parent: My process id is %d\n", getpid());
printf("Parent: My parent is %d\n", getppid());
printf("Parent: I am exiting\n");
}
int main()
{
pid_t n = fork();
if(n<0)
{
perror("fork failed:");
exit(EXIT_FAILURE);
}
else if(n==0)
childprocess();
else
parentprocess();
}
输出:
Parent: Hi I am the parent process
Parent: My process id is 21550
Parent: My parent is 7452
Parent: I am exiting
Child: Hi I am the child process
Child: My process id is 21551
Child: My parent is 1810
Child: I am exiting
如果我重新执行。有时输出是我所期望的,有时是出乎意料的。
发现 reason.That 很愚蠢。 parent 首先结束,因此 child(孤儿)被 init 进程采用。
在我的例子中,它是进程 ID 为 1810 的 Upstart。
Upstart is an event-based replacement for the /sbin/init
确实,不能保证调度器会先调度子进程。父进程可能会在子进程 运行 之前终止。并且由于在 Linux 中每个进程都有一个父进程(交换进程除外),孤儿被分配给 init。
您可以添加一个wait()
以便父进程等待子进程。