我无法理解为什么它会打印8倍的文字。在我的构思中,它应该只打印2次。 能不能帮助我吗?
代码:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
pid_t x=0;
pid_t y=0;
x=fork();
if(y>0)
fork();
if(x==0)
y=fork();
fork();
if(y==0){
fork();
printf("Some text\n");
}
}
答案 0 :(得分:4)
x = fork();
已执行且正在运行2个进程。
if (y>0) fork();
永远不会被执行。
if (x==0) y=fork();
,因此现在有3个进程正在运行。对于初始父级y
仍为0
。对于孩子而言y == child_child's pid
以及孩子的y==0
。
所有3个进程都将执行fork()
,因此共有6个进程,其中4个进程内存y==0
。
这4个进程再次分叉,因此有8个进程并执行printf(...);
答案 1 :(得分:1)
我修改代码以进行更多调试打印。
#include <stdio.h>
#include <stdlib.h>
#include "unistd.h"
int main() {
pid_t x=0;
pid_t y=0;
printf("FORK X \n");
x=fork();
if(y>0) {
printf("FORK 1 \n");
fork();
}
if(x==0) {
printf("FORK 2 \n");
y=fork();
}
printf("FORK 3 \n");
fork();
if(y==0){
printf("FORK 4 \n");
fork();
printf("Some text\n");
}
}
这是输出,每个&#34; FORK 4&#34;将导致TWO&#34;一些文字&#34;因为之后有一个分叉:
煎饼:tmp greedy52 $ ./a.out
FORK X
FORK 3
FORK 4
FORK 2
FORK 4
Some text
Some text
FORK 3
FORK 3
Some text
Some text
FORK 4
Some text
FORK 4
Some text
Some text
Some text
4&#34; FORK 4&#34;到达(每个成功的fork()调用创建两个进程A和B):
@ x = fork() - &gt; x = 0和@ y = fork() - &gt; y!= 0分支没有生成任何&#34;某些文字&#34;。
FORK X --------> x != 0 -------------------------------> FORK 3 A -----> FORK 4 A (Some text)
| | |--> FORK 4 B (Some text)
| |
| |-----------------------------> FORK 3 B -----> FORK 4 A (Some text)
| |--> FORK 4 B (Some text)
|
|
|----> x == 0 -----> FORK 2 A ( y = 0 ) -----> FORK 3 A -----> FORK 4 A (Some text)
| |--> FORK 4 B (Some text)
| |---> FORK 3 B -----> FORK 4 A (Some text)
| |--> FORK 4 B (Some text)
|
|---> FORK 2 B (y != 0 ) -----> FORK 3 A -----> XXX bad end
|---> FORK 3 B -----> XXX bad end