2017-03-07 41 views
0

我有理解这个代码的行为问题:不规则导致僵尸例如

#include <stdio.h> 
#include <stdlib.h> 
int main() { 
int nr; 
nr = fork(); 
    if (nr == 0) { 
    /* Child process */ 
    printf("Child process, fork return value %d\n", nr); 
    exit(0); 
    } else { 
    /* Parent process */ 
    printf("Parent process, fork return value: %d\n", nr); 
    exit(0); 
    } 
} 

在Unix shell中运行。当我得到这样的结果:

Parent process, fork return value: 343 
Child process, fork return value: 0 

但有时它只是给了我这个结果没有任何shell提示符:

Child process, fork return value: 0 

我知道它可以用父进程中的wait()函数来解决。但我想知道:

为什么结果不规则?有人能解释发生了什么吗?子进程成为僵尸,但为什么父母不处理printf()函数调用运行?

+1

我想这对Linux和永远无法看到你的描述。相反,我总是得到两个消息。我甚至试图给父亲和/或孩子安排睡眠,但除了预期的延误之外,没有任何改变。从理论上讲,我也找不到你的观察结果。你介意告诉我们你的系统发生了什么? – Alfe

+0

父进程也应该打印该消息。僵尸进程是当父进程在父进程“等待”之前完成执行的时候。 printf在它变成'僵尸进程'之前执行。父母应该打印它的消息,不管子进程是什么......在叉子共享相同的'stdout'之后,他们是独立的进程,因为你没有重定向。 –

回答

1

有2 issuse到海外商品会有: 1)还有就是你可能要刷新

fflush(stdout); 

2标准输出缓冲)多任务有时可以执行在一个意想不到的顺序 的东西,我得到这样的事情时,出现这种情况:

/tmp$ ./a.out 
Parent process, fork return value: 24049 
/tmp$ Child process, fork return value 0 

正如你所看到的提示是在子进程输出的开始,它不是完全缺少它只是不是你希望它是。

有了这个代码,我试了几次位从未有过的孩子或父母的德输出线提示:

#include <stdio.h> 
#include <stdlib.h> 
int main() { 
int nr; 
nr = fork(); 
    if (nr == 0) { 
    /* Child process */ 
    printf("Child process, fork return value %d\n", nr); 
    fflush(stdout); 
    exit(0); 
    } else { 
    /* Parent process */ 
    printf("Parent process, fork return value: %d\n", nr); 
    fflush(stdout); 
    sleep(1); 
    exit(0); 
    } 
} 
+0

这个答案是错误的,因为无论执行顺序是什么都没有关系,两个消息都应该打印到'stdout'。 OP观察到的是父母不打印。 –

+0

没有什么OP可能观察到是乱序印花露水多任务。我已经重现了错误,并且我可以看到在其中一条输出行中显示的提示。 – louigi600

+0

如果他错过了整条线,我很有可能fflush会解决这个问题。 – louigi600