サンプル1.1

サンプル1.1

関数を使用すると、次のようにwait例1.1を実行するとSIGCHLD信号が消費されます。wait

サンプル1.1

if (pid==0){
    printf("child\n");
    printf("%d\n",pid);
}
else{
    printf("Parent\n");
    printf("%d\n",pid);
    wait(NULL);
    sleep (10);                             
}

この関数を省略した例1.2(以下)を実行すると、wait子プロセスは失敗します。wait関数が信号を処理するのはなぜですかSIGCHLD

例1.2

if (pid==0){
    printf("child\n");
    printf("%d\n",pid);
}
else{
    printf("Parent\n");
    printf("%d\n",pid);
    sleep (10);                             
}

ベストアンサー1

あなたの2つのサンプルを読むことはできますが、あなたの質問はほとんど意味がありません。

POSIX / Single Unix仕様バージョン4、2018版によると、プロセスが子プロセスの状態を無視したいことをシステムに明示的に示していない場合:

  • ステータス情報(終了ステータスコードなど)を生成する必要があります。

  • [Exit]プロセスはゾンビプロセスに置き換える必要があります。 ...

  • 親プロセスがプロセスの状態情報を取得すると、プロセスのライフサイクルが終了します。

  • プロセスが終了するのを待っている間にwait()、waitid()、またはwaitpid()を呼び出すときに、呼び出しプロセスの親プロセス内の1つ以上のスレッドがブロックされると、その1つ(または存在する場合)がwaitidを呼び出すことになります。 ()WNOWAITを含む、可能であればそれ以上)このスレッドは、[終了した]プロセスのステータス情報を取得してブロックを解除する必要があります。

  • SIGCHLDは親プロセスに送信する必要があります。

最後に注意してください -SIGCHLD常に作成してください(親がそれを無視するように指定しない限り)!

修正する

私はあなたのプログラムスニペットのうちの2つをテストしましたが、私の考えには妥当だと思います。どちらも正常に実行されます。以下は、2つの完全なプログラムソースコードとターミナル出力です。

完全な例1.1:

#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>

int main()
{
    pid_t pid;

    pid = fork();

    if( pid == 0 ) {
        printf("child\n");
        printf("%d\n", pid);
    }
    else {
        printf("Parent\n");
        printf("%d\n", pid);
        wait(NULL);
        sleep(10);
    }
}

完全な例1.2:

#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>

int main()
{
    pid_t pid;

    pid = fork();

    if( pid == 0 ) {
        printf("child\n");
        printf("%d\n", pid);
    }
    else {
        printf("Parent\n");
        printf("%d\n", pid);
        sleep(10);
    }
}
//64-bit Mac Mini./
$ make s1 s2 ; ./s1 ; ./s2
make: `s1' is up to date.
make: `s2' is up to date.
Parent
46431
child
0
Parent
46449
child
0

//64-bit Mac Mini./
$

おすすめ記事