1. ホーム
  2. linux

[解決済み] Linuxの標準的な終了ステータスコードはありますか?

2022-03-16 12:30:28

質問

Linuxでは、プロセスの終了ステータスが0であれば、正しく終了したとみなされる。

セグメンテーションフォールトの場合、終了ステータスが11になることがよくありますが、これは単に私が働いているところの慣習なのか(このように失敗したアプリはすべて内部的なものでした)、標準なのかはわかりません。

Linuxのプロセスには、標準的な終了コードがありますか?

解決方法は?

からの戻り値で、リターンコードの8ビットとキリングシグナルの番号の8ビットが1つの値に混在しています。 wait(2) & co. .

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

int main() {
    int status;

    pid_t child = fork();
    if (child <= 0)
        exit(42);
    waitpid(child, &status, 0);
    if (WIFEXITED(status))
        printf("first child exited with %u\n", WEXITSTATUS(status));
    /* prints: "first child exited with 42" */

    child = fork();
    if (child <= 0)
        kill(getpid(), SIGSEGV);
    waitpid(child, &status, 0);
    if (WIFSIGNALED(status))
        printf("second child died with %u\n", WTERMSIG(status));
    /* prints: "second child died with 11" */
}

終了ステータスはどのように判断しているのですか? 従来、シェルは8ビットのリターンコードしか保存しませんが、プロセスが異常終了した場合はハイビットをセットします。

$ sh -c 'exit 42'; echo $?
42
$ sh -c 'kill -SEGV $$'; echo $?
セグメンテーションの不具合
139
$ expr 139 - 128
11

もしこれ以外のものが表示されるなら、おそらくそのプログラムは SIGSEGV シグナルハンドラを呼び出すと exit のように、シグナルによって実際に殺されることはありません。 (プログラムは SIGKILLSIGSTOP .)