0

子プロセスを作成してすぐに終了(_exit())した後、待機してステータスを確認したい。ここで、if/else コンストラクトの「else」ブランチで、WIFSIGNALED も確認する必要があるかどうか疑問に思います。私が理解している限り、待機を実行すると、a) エラーが発生した可能性があります (-1)、子は (exit() または _exit()) によって正常に終了した可能性があります。信号なので、チェックを省略できますよね?

//remainder omitted

int status;

pid_t t_pid = wait(&status);

if (t_pid == -1) {
    perror("wait");
    exit(EXIT_FAILURE);
}

if (WIFEXITED(status)) {
    printf("child terminated normally, status = %d\n",
           WEXITSTATUS(status)
    );
} else { // <-- do it have to check for WIFSIGNALED() here?
    printf("child was terminated by a signal, signum = %d\n",
           WTERMSIG(status)
    );
}
4

3 に答える 3

1

はい。 POSIX.1の状態:

stat_loc が指す情報が、WUNTRACED フラグまたは WCONTINUED フラグを指定しない waitpid() の呼び出しによって、または wait() 関数の呼び出しによって格納された場合、マクロ WIFEXITED(*stat_loc) および WIFSIGNALED( *stat_loc) はゼロ以外の値に評価されます。

WUNTRACED または WCONTINUED でwaitpid()を使用すると、代わりに WIFSTOPPED(*stat_loc) または WIFCONTINUED(*stat_loc) が true であるステータスを取得できます。

于 2010-03-29T17:09:22.160 に答える
1

知らない。

しかし、あなたはあなたの子供を「異常に」死なせる可能性があります. 子の kill(getpid()) ?

http://publib.boulder.ibm.com/infocenter/tpfhelp/current/index.jsp?topic=/com.ibm.ztpf-ztpfdf.doc_put.cur/gtpc2/cpp_wifsignaled.html

ドキュメントの言葉の響きから、あなたは正しくやっていると思います。

于 2010-03-29T12:39:54.907 に答える
1

はい、あなたは正しいです。wait成功した場合は、またはのいずれWIFEXITED()WIFSIGNALED()が true になります。

于 2010-03-29T12:46:40.480 に答える