簡體   English   中英

如何讓子進程等待信號?

[英]How to let child process wait for signal?

在下面的代碼中,我創建了 3 個子進程。 我希望父母在讓父母和 3 個孩子同時繼續之前完成[some code 1] ,並等待所有孩子都死后再繼續[some code 3]

但很明顯,在運行代碼時,有時孩子們會在發送 SIGSTOP 之前開始自己的[some code x] 現在我不能使用sleep() 我該怎么做才能確保孩子在父母完成之前等待[some code 1]

    pid_t fpid1 = fork();
    if (fpid1 > 0) { // parent
        kill(fpid1, SIGSTOP);
        pid_t fpid2 = fork();
        if (fpid2 > 0) { // parent
            kill(fpid2, SIGSTOP);
            pid_t fpid3 = fork();
            if (fpid3 > 0) { // parent
                kill(fpid3, SIGSTOP);
                [some code 1];
                kill(fpid1, SIGCONT);
                kill(fpid2, SIGCONT);
                kill(fpid3, SIGCONT);
                [some code 2];
                while(wait(NULL) > 0);
                [some code 3];
            }
            else if (fpid3 == 0) { // child 3
                [some code 4];
                exit(0);
            }
        }
        else if (fpid2 == 0) { // child 2
            [some code 5];
            exit(0);
        }
    }
    else if (fpid1 == 0) { // child 1
        [some code 6];
        exit(0);
    }

延遲呼叫 fork 會有幫助嗎? 像這樣的東西:

#include <sys/types.h>
#include <sys/wait.h>

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int
main(void)
{
    puts("some code 1");

    puts("some code 2");

    pid_t fpid1 = fork();
    if (fpid1 == 0) {
        puts("some code 6");
        exit(0);
    }

    pid_t fpid2 = fork();
    if (fpid2 == 0) {
        puts("some code 5");
        exit(0);
    }

    pid_t fpid3 = fork();
    if (fpid3 == 0) {
        puts("some code 4");
        exit(0);
    }

    while (wait(NULL) > 0);
    puts("some code 3");
}

不是一些代碼 1-6 以任何順序運行,只有一些代碼 4-6 應該像這樣。 這也有去除嵌套的副作用。

我個人在使用 fork 時總是尊重這種模式:我希望它可以幫助你 😅

if (fork == -1) { 
    // error // 
} else if (fork == 0) { 
    // child processing // 
    kill(getpid, SIGKILL)
} else {
    waitpid(pid, status, -YOUR OPTION-);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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