2014-10-08 48 views
0

我有了这个程序,它创建一个孤立的过程,但我不太明白的控制流程是控制流量,从而由它给出的输出:这个节目

#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; 
} 

输出:

[email protected]:~/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... 

[email protected]:~/ds/unix$ 
Process 2576 is done its Parent pid 1... 

所以它首先生成'子进程......',然后睡10秒。并再次执行'子进程等等'。再次看到事情发生'父母完成....'

请帮助我,即使这个问题看起来很愚蠢。

+0

请解释一下这个程序是如何工作的? – 2014-10-08 00:34:41

+0

这个程序的哪部分你不明白? – 2014-10-08 00:36:12

+0

我不明白,执行程序1st给出if语句后的第一行,然后睡10秒,再次创建一个新的孩子睡10秒,然后以类似的方式执行第二个printf语句。 – 2014-10-08 00:40:20

回答

1
  1. 您的程序已启动,创建一个我们称之为父进程的进程。

  2. 调用fork()复制父进程及其整个状态并执行它,创建子进程。父母和子女进程现在正在同时运行。

  3. a)子进程从fork()收到0作为返回值,所以它睡10秒。 b)父进程收到子进程的pid作为fork()的返回值,当然这个值不等于0;所以父进程不会睡10秒。

  4. 父进程打印"the child process pid is 2575 parent pid 1922"。然后,父进程遇到要睡眠20秒的指令,并且这样做。

  5. 孩子从10秒睡眠中醒来。它打印"The child process pid is 2576 parent pid 2575"。之后,子进程遇到要睡眠20秒的指令,并且这样做。

  6. 父进程从20秒睡眠中醒来。它打印"Process 2575 is done its Parent pid 1922...",然后退出。

  7. 孩子从20秒睡眠中醒来。它打印"Process 2576 is done its Parent pid 1...",然后退出。但是,为什么是父亲1,尽管早些时候是2575?由于父进程已经退出,导致子进程被init进程孤立,其进程的pid为1.

+0

谢谢你现在很清楚。 – 2014-10-08 01:02:12

0

家长和孩子之间唯一不同的是sleep(10)。所以这两个printfsleep(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,而祖父母是PID 1922祖父母是启动程序的shell进程。

+0

好吧,你的意思是说,两个进程在同一时间开始,但父母没有输入if语句,因为它的p == 1,然后它打印第一个printf,然后休眠20秒,那时孩子完成了它的睡眠和打印第一条语句,但是父母什么时候终止。 – 2014-10-08 00:54:20

+0

@VivekGiri是的,这是一般的想法。但是,来自fork的返回值对于孩子来说是“0”,对父母来说是“2576”(使用来自您的示例输出的值)。换句话说,叉子告诉父母新创建的孩子的PID。 – user3386109 2014-10-08 01:00:42

+0

感谢您的回答我现在了解它。 – 2014-10-08 01:07:03