web-dev-qa-db-ja.com

Cでの終了コード11の意味?

Cの終了コード11の一般的な意味は何ですか?私は周りを見回したが、決定的な答えを見つけることができないので、私はここで尋ねると思った。要素をベクターに追加しようとするとそれが来ます。

13
user3593148

決定的な答えは見つかりませんでした。使用する終了コードを決定するのはプログラムの作成者次第です。標準Cは、exit(0)またはexit(EXIT_SUCCESS)がプログラムの成功を示し、exit(EXIT_FAILURE)が何らかのエラーを示すことのみを示しています。 (mainから値を返すことは、その値でexitを呼び出すことと同等です。)Windows、Linux、OSXなどを含むほとんどの一般的なオペレーティングシステムは、成功に0を、1から255までの値を使用しますエラーを示します。エラーコードを選択するのはアプリケーション作成者次第であり、値11は特別なものではありません。

Linuxおよび他のほとんどのUnixバリアントでは、 signal 番号11は セグメンテーションフォールトを示しますKerrek SB で述べられています。プログラムが何らかの無効なメモリアクセスを行うと、セグメンテーションフォールトが発生するため、範囲外の配列へのアクセス、ポインター演算のエラー、ヌルポインターへのアクセス試行、またはその他のポインター関連エラーのもっともらしい結果です。シグナル11は、終了コード11と同じものではありません。シグナルが原因でプログラムが終了すると、正常に終了したのではなく、シグナルによって強制終了されたとマークされます。 Unixシェルは、シグナル番号に128を加えた終了コードを報告することでシグナルを報告します。したがって、セグメンテーション違反の場合は139です。

11
Gilles

他の回答は、「出口コード」というフレーズのあいまいさを逃しました。 「終了コード」が意味するのは、waitファミリーのシステムコールで取得したステータスコードのようです。

_/* assume a child process has already been created */
int status;
wait(&status);
printf("exit code %d\n", status);
_

そのようなことをすると、子プロセスがセグメンテーション違反を起こした場合に「終了コード11」が表示される可能性があります。子プロセスが実際にexit(11)を呼び出した場合、代わりに「終了コード2816」が表示される場合があります。

Exitに渡される値との混乱を避けるために、これらのことを「exit code」ではなく「wait code」または「wait status」と呼ぶ方がよいでしょう。待機コードには、単一の整数にまとめられたいくつかの情報が含まれています。通常、整数を直接見ないでください(上記のprintfで行ったように)。代わりに、_W*_の_<sys/wait.h>_マクロを使用して分析する必要があります。

_WIF*_マクロから始めて、何が起こったかkindを見つけ、その情報を使用して、詳細を取得するために使用する他の_W*_マクロを決定します。

_if(WIFEXITED(status)) {
  /* The child process exited normally */
  printf("Exit value %d\n", WEXITSTATUS(status));
} else if(WIFSIGNALED(status)) {
  /* The child process was killed by a signal. Note the use of strsignal
     to make the output human-readable. */
  printf("Killed by %s\n", strsignal(WTERMSIG(status)));
} else {
  /* ... you might want to handle "stopped" or "continued" events here */
}
_
5
user2404501

特定の状況でアプリケーションが設定する必要がある終了コードを定義した標準はありません。どの終了コードがどのエラーまたは成功さえ表すかは、完全にプログラマー次第です!

プログラマは、ゼロ以外の値がエラーを示すと判断する場合があり、この値がオペレーティングシステムのエラーコードと等しい場合があります。

Windowsでは、ファイルの問題のため、終了コード11 mightを使用します。このエラーコードの説明が必要な場合(これはWindowsに固有であり、必ずしもアプリケーションではありません)net helpmsg 11

0
Marged