2014-10-08 20 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