我修改代碼有更多的調試打印。
#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");
}
}
這裏是輸出,和每一個 「撥叉4」 將導致兩個 「一些文本」 因爲有一個叉算賬:
煎餅: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 「FORK 4」 被達到(每次成功fork()調用創建兩個處理A和B):
- @ X =叉() - > x = 0和@FORK 3叉! A
- @ x = fork() - > x!= 0和@FORK 3 fork B
- @ x = fork() - > x = 0和@ y = fork() - > y = 0和@FORK 3叉甲
- @ X =叉() - > x = 0和@ Y =叉() - > Y = 0和@FORK 3叉乙
的@ X =叉() - > x = 0和@ y = fork() - > y!= 0分支不會生成任何「某些文本」。
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
只有兩次,有很多叉路呼叫!你有沒有嘗試添加一些'printf'來跟蹤控制流? –
這看起來像是一份給我的學校作業。這個問題的目的是什麼? – manishg
是的,這是一個學校作業。我必須確定文本打印的次數。 –