1. ホーム
  2. c

[解決済み] Linuxのシステムコールで子プロセスを殺すために、なぜwaitの後にWIFEXITEDをチェックする必要があるのですか?

2022-03-01 10:28:35

質問

の戻り値をチェックするC言語のコードに出会いました。 wait をチェックし、エラーでなければさらに WIFEXITEDWIFEXITSTATUS . なぜこれが冗長でないのか?私が理解する限りでは wait はエラーが発生した場合 -1 を返し、一方 WIFEXITED は0以外の値を返します。 wait 子プロセスは正常に終了しました。ですから、もしこの行にエラーがなかったら if ( wait(&status) < 0 ) で何か問題が発生するのでしょうか? WIFEXITED チェック?

これがそのコードです。

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

#define CHILDREN_NUM 5

int main () {

    int i, status, pid, p;
    for(i = 0; (( pid = fork() ) < 0) && i < CHILDREN_NUM;i++)
        sleep(5);


    if ( pid == 0 )
    {
        printf(" Child %d : successfully created!\n",i);
        exit( 0 );  /* Son normally exits here! */
    }

    p = CHILDREN_NUM;
    /* The father waits for agents to return succesfully */
    while ( p >= 1 )
    {
        if ( wait(&status) < 0 ) {
            perror("Error");
            exit(1);
        }

        if ( ! (WIFEXITED(status) && (WEXITSTATUS(status) == 0)) )  /* kill all running agents */
        {
            fprintf( stderr,"Child failed. Killing all running children.\n");
           //some code to kill children here
            exit(1);
        }
        p--;
    }

    return(0);
}

解決方法は?

wait 戻る >= 0 を呼び出すと、子プロセスが終了したことがわかります。 wait しかし、そのプロセスが正常に終了したかどうか(あるいはそれがシグナルされたかどうか)はわかりません。)

しかし、あなたのコードを見ると、プログラムが、終了した子プロセスが正常に終了したかどうかを気にしていることがよくわかります。

<ブロッククオート

fprintf( stderr,"Child failed. Killing all running children.\n");

そこで、このプログラムでは、さらにテストを行うために status によって入力された構造体は wait :

  • WIFEXITED(status) : プロセスは正常に終了したのでしょうか?(シグナルを受けたのとは対照的に)。
  • WEXITSTATUS(status) == 0 : プロセスが終了コード 0 (別名 "success") で終了したかどうか。詳しくは、以下を参照してください。 linux コマンドが返す終了ステータス 1 の意味 .