「子」プロセスが親よりも先に終了するのはなぜですか?

「子」プロセスが親よりも先に終了するのはなぜですか?

与えられたコード例は次のとおりです。

# include <stdio.h>
# include <unistd.h>
void main() {
    static char *mesg[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
    int display(char *), i;
for (i=0; i<10; ++i)
    display(mesg[i]);
sleep(2);
}

int display(char *m) {
char err_msg[25];
switch (fork()) {
    case 0:
        execlp("/bin/echo", "echo", m, (char *) NULL);
        sprintf (err_msg, "%s Exec failure", m);
        perror(err_msg); return(1);
    case -1:
        perror ("Fork failure"); return(2);
    default:
        return(0);
}
}

今、このプログラムを実行する前の私の前提は、親が子の前に終わるということでした。だから私の予想結果は次のとおりです。

0
1
2
3
4
5
6
7
8
9

ただし、プログラムを実行するたびに、プロセスの順序はランダムに指定されます。私の質問は「なぜ?」です。プロセッサがプロセス間でジャンプする「コンテキストスイッチ」のためですか?一部のプロセスは、他のプロセスよりも多くの「リソース割り当て」を取得しますか?親プロセスと子プロセスの順序は変更できませんか?これがゾンビプロセスと孤児プロセスがある理由ですか?

ベストアンサー1

fork() 子プロセスが実行を開始するとすぐに、実際には「開始」でなくても、親プロセスと同様に fork() 呼び出し後のコードで実行され続けます。 fork() の戻り値のみが異なります。両親と子供は順序に関係なく出ることができます。はい。コンテキスト切り替えにより、すべてのプロセスがランダムに実行されます。

子プロセスが終了し、親プロセスが子プロセス終了コードを正しく「インポートしない」場合、ゾンビプロセスが発生します。ゾンビプロセスには、デフォルトではまだ検索されていない終了コードが含まれており、それを見るたびに不注意な親プロセスを非難します。 (ゾンビは親プロセスが寿命が短く、管理が必要ない限り親プロセスのバグです。) 親プロセスが子プロセスの前に終了すると、子プロセスはPID 1にリセットされ、シャットダウンを実行します。コード収穫。 (この過程でゾンビも削除されます。)

おすすめ記事