2011-08-15 127 views
1

我正在尝试一些简单的代码上叉。当我给出这样的代码时,它工作正常。这将打印叉和僵尸进程

我是孩子

我父

,然后等待30秒。我明白这是由于这两个过程之间的切换。第一个孩子,然后执行父母和子女,然后...

#include<stdio.h> 
#include<stdlib.h> 
main() 
{ 
    int pid; 
    pid=fork(); 
    if(pid==0) 
    { 
     printf("\nI am the child\n"); 
     sleep(30); 
     exit(0); 
    } 
    if(pid>0) 
    { 
     printf("\nI am the parent\n"); 
     wait(); 
    } 
} 

但是,当我给像(无父等待)

#include<stdio.h> 
#include<stdlib.h> 
main() 
{ 
    int pid; 
    pid=fork(); 
    if(pid==0) 
    { 
     printf("\nI am the child\n"); 
     sleep(30); 
     exit(0); 
    } 
    if(pid>0) 
    { 
     printf("\nI am the parent\n"); 

    } 
} 

它只是打印

我是孩子

我是母公司

并退出(不等待30秒)。

那么是因为没有等待调用父节点退出并且子节点仍在执行?但为什么它没有出现在终端(等待中)?

父母是否在这里变成僵尸?

+1

请不要使用太多的问号。 ;-) – Nayuki

回答

4

您的观察结果是正确的。

终端等待原始进程(即父节点)退出。它不会等待任何子进程退出。

僵尸:一个进程是一个僵尸,如果它已经退出,但是它的父进程没有对它调用wait()。

在你的情况下,父母不会成为僵尸,因为终端正在等待它。

0

shell正在等待父项完成,但未等到子项。

孩子在30秒后变成僵尸(该shell将在下一次提示时清理)。

2
  1. 是的。
  2. 祖父母从不等待孩子;没有父母的孩子被重新初始化。
  3. 不,它会死亡。
+0

3需要澄清。僵尸也死了。 –

0

在第二个例子中,孩子成为孤儿,因为父母在孩子活着时已经返回。孤儿进程属于init而不是shell,这就是为什么它没有显示出来。你的两个代码示例中没有僵尸。僵尸是当父母活着的时候,孩子已经死了,家长没有打电话等孩子变成僵尸。