簡體   English   中英

進程未按預期順序執行; fork() 和 waitpid()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM