[英]Processes not executing in expected order; fork() and waitpid()
我編寫了一個調用fork()
兩次的程序,生成了三個孩子和一個父母。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
int child1 = fork();
int child2 = fork();
// Check for error
if (child1 < 0 || child2 < 0) {
fprintf(stderr, "A fork failed :(\n");
exit(1);
}
// Parent Process
if (child1 > 0 && child2 > 0) {
waitpid(child1, NULL, 0);
waitpid(child2, NULL, 0);
printf("I'm the parent\n");
}
// Child B -- CONFUSION AREA --
else if (child1 > 0 && child2 == 0) {
waitpid(child1, NULL, 0); // Not waiting for process to finish
printf("I'm child B\n");
}
// Child A
else if (child1 == 0 && child2 > 0) {
waitpid(child2, NULL, 0);
printf("I'm child A\n");
}
// Child C
else if (child1 == 0 && child2 == 0) {
printf("I'm child C\n");
}
return 0;
}
我正在嘗試打印
I'm child C
I'm child A
I'm child B
I'm the parent
但相反,程序打印出來
I'm child B
I'm child C
I'm child A
I'm the parent
我很困惑為什么孩子 B 不等待child1
進程完成?
我畫了一個流程樹來嘗試了解發生了什么,我的理解是它看起來像:
/*
Parent (15543)
child1 = 15544;
child2 = 15545
/ \
/ \
/ \
A (15544) B (15545)
child1 = 0; child1 = 15544;
child2 = 15546; child2 = 0;
/
/
/
C (15546)
child1 = 0;
child2 = 0;
*/
當子 B 調用waitpid()
時,調用失敗並返回 -1,因為父進程已經在等待子 A,並且您不能兩次獲取子進程。
對於您想要的行為,您最好使用進程間信號量來同步您的進程執行。 嘗試包含semaphore.h
並查看sem_init()
的文檔。
當您執行第一個fork()
時,兩個進程(父進程和子進程) go 到第二個fork()
並生成您在樹中看到的另外兩個進程。 這就是您在 output 中看到孫子的原因。 您認為只執行了兩個 fork,因此預期有兩個子進程,但您沒有意識到第二個fork()
實際上是由兩個進程執行的:第一個fork()
調用的父進程和子進程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.