簡體   English   中英

如何fork()n子進程執行不同的函數?

[英]How to fork() n child processes doing diferrent functions?

這是我的代碼:

for (c = 0; c < PROCESSES; c++) {
    pid[c] = fork();
    switch (pid[c]) {
        case -1:
            perror("Faild fork!\n");
            break;
        case 0:
            printf("C = %d\n", c);
            if (c == 0) {
                printf("MY ID0 %d\n", getpid());
                customers();
                break;
            }
            if (c == 1) {
                printf("MY ID1 %d\n", getpid());
                cashier();
                break;
            }
            if (c == 2) {
                printf("MY ID2 %d\n", getpid());
                sales();
                break;
            }
            if (c == 3) {
                printf("MY ID3 %d\n", getpid());
                warehouse();
                break;
            }
            break;

        default:
            if (c == (PROCESSES - 1)) {

                for (j = 0; j < PROCESSES; j++) {
                    w = wait(&state);
                    if (w == -1) {
                        perror("Erro na espera!\n");
                    }
                    printf("Terminar processo %d\n", w);
                }
                sleep(2);
                printf("Fim da simulação.\n\n");
                free_shm_sem();
            }

    }
}

我期待發生的事情:

C = 0
MY ID0 3904
C = 1
MY ID1 3905
C = 2
MY ID2 3906
C = 3
MY ID3 3907

發生了什么:

C = 0
MY ID0 3904
C = 1
MY ID1 3905
C = 2
MY ID2 3906
C = 3
MY ID3 3907
C = 3
MY ID3 3911

如果我改為:

            if (c == 0) {
                printf("MY ID0 %d\n", getpid());
                customers();
                break;
            }
            if (c == 1) {
                printf("MY ID1 %d\n", getpid());
                sales();
                break;
            }
            if (c == 2) {
                printf("MY ID2 %d\n", getpid());
                cashier();
                break;
            }
            if (c == 3) {
                printf("MY ID3 %d\n", getpid());
                warehouse();
                break;
            }

輸出成為:

C = 0
C = 2
C = 1
MY ID0 3960
MY ID2 3962
C = 3
MY ID1 3961
MY ID3 3963
C = 2
MY ID2 3967
C = 3
MY ID3 3968

為什么c會改變它的值,有時會經過兩次同一個地方?

這不是fork()n孩子做不同進程的正確方法嗎?

PS對不起,我的英語不好。 我希望你能理解我說的話。

您是否正在考慮所有分叉進程繼續迭代for循環並分叉更多進程的事實?

考慮第一次迭代:

for (c = 0; c < PROCESSES; c++) { // c is 0

我們做一個分叉:

 pid[c] = fork();

現在,在子進程中, pid[0]為0.所以,

switch (pid[c]) {

進入:

case 0:
       if (c == 0) {
            printf("MY ID0 %d\n", getpid());
            customers();
            break;
        }

並做一些印刷。 然后它就會掉出開關。 並且c是0.因此它將c遞增到1,並執行:

 pid[c] = fork();

分叉一個大孩子。

為了防止這種情況,您可以exit而不是break

        if (c == 0) {
            printf("MY ID0 %d\n", getpid());
            customers();
            exit(0);
        }

首先, fork啟動了parellel進程,不能保證它會按順序運行

對於應該做特殊處理(即,四個第一)的過程做一個單獨的步驟調用fork為他們每個人在父進程。 然后創建一個循環,創建您可能需要的所有通用流程。

暫無
暫無

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

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