我有这个程序可以创建一个孤儿进程,但是我不太了解它的控制流程,因而也就是它给出的输出:
#include<stdio.h>
#include<unistd.h>
int main()
{
pid_t p;
/* create child process */
p=fork();
if(p==0) {
/* fork() returns Zero to child */
sleep(10);
}
printf("The child process pid is %d parent pid %d\n", getpid(), getppid());
/*parent/child waits for 20 secs and exits*/
sleep(20);
printf("\nProcess %d is done its Parent pid %d...\n", getpid(), getppid());
return 0;
}
输出:
shiv@ubuntu:~/ds/unix$ ./a.out
The child process pid is 2575 parent pid 1922
The child process pid is 2576 parent pid 2575
Process 2575 is done its Parent pid 1922...
shiv@ubuntu:~/ds/unix$
Process 2576 is done its Parent pid 1...
因此它先生成'子过程......'然后再睡10秒钟。并再次执行'儿童过程等等'。再次看到事情发生在'父母已经完成......'
即使这个问题看起来很傻,也请帮助我。
答案 0 :(得分:1)
您的程序已启动,创建了一个我们称之为父流程的流程。
对fork()
的调用会复制父进程及其整个状态并执行它,从而创建子进程。父子进程现在同时运行。
a)子进程从fork()
接收0作为返回值,因此它休眠10秒。
b)父进程接收子进程的pid
作为fork()
的返回值,当然不等于0;所以父进程不会睡10秒。
父进程打印"the child process pid is 2575 parent pid 1922"
。然后父进程遇到睡眠指令20秒,并且这样做。
儿童过程从10秒睡眠中醒来。它打印"The child process pid is 2576 parent pid 2575"
。之后,子进程遇到睡眠指令20秒,并且这样做。
父进程从20秒睡眠中醒来。它打印"Process 2575 is done its Parent pid 1922..."
,然后退出。
孩子的过程从20秒睡眠中醒来。它打印"Process 2576 is done its Parent pid 1..."
,然后退出。但为什么父母的pid 1,即使它早于2575?因为父进程已经退出,这导致子进程被init进程孤立,进程的pid为1.
答案 1 :(得分:0)
父母和孩子之间唯一不同的是sleep(10)
。因此,两个printf
和sleep(20)
将由子和父执行。但由于sleep(10)
来自孩子的printfs将在父母对应的printfs之后延迟10秒。
这就是说第一个printf
具有误导性。它应该说
printf( "my pid is %d and my parent's pid is %d\n", getpid(), getppid() );
在您的示例输出中,子项为pid 2576,父项为2575, grandparent 为pid 1922.祖父表是启动程序的shell进程。