4

system(COMMAND)Linux で実行されているコードで関数を使用してコマンドを実行するとC++、呼び出しの戻り値がsystem(COMMAND)互いに異なります。関数の戻り値を使って、セグメンテーション違反異常終了を検出する方法はありsystem(COMMAND)ますか?

たとえば、system関数を使用してコマンドを実行した後にセグメンテーション違反が発生した場合、その関数の戻り値が 35584 であることを確認しました。しかし、その戻り値が何を意味するのかはわかりませんでした。 . セグメンテーション違反または異常終了が発生したときに、戻り値のすべての可能な値を検出する方法はありますか?

4

4 に答える 4

5

man 3 systemman 2 wait戻り値の意味については を参照してください。後者のページでは、この値で使用できるいくつかのマクロ、特にWIFSIGNALED(status)とについて説明していますWTERMSIG(status)。これは、セグメンテーション違反や他のシグナルの終了をチェックするために使用できるものです。

于 2013-01-08T19:11:14.873 に答える
2
#include <cstdlib>
#include <iostream>

int main()
{
  const int result = system("./core_dump"); // core_dump only calls abort()
  std::cout << "result=" << result << '\n';
  std::cout << "Terminated by signal: " << (WIFSIGNALED(result) ? "yes" : "no") << '\n';
  std::cout << "Exited normally: " << (WIFEXITED(result) ? "yes" : "no") << '\n';
  return 0;
}

出力 (Ubuntu 12.10 の場合):

Aborted (core dumped)
result=34304
Terminated by signal: no
Exited normally: yes

./core_dumpが出力されるのは驚くべきことかもしれませんexited normally: yes./core_dump失敗しましたが、正常に終了したコマンドを実行しているプロセスsystemの終了コードを返します。/bin/sh -c

対照的に、system("/bin/kill -9 $$")代わりに呼び出すとsystem("./core_dump")、次の出力が得られます。

result=9
Terminated by signal: yes
Exited normally: no

終了コードに関するもう 1 つのメモ。このcore_dump例では、終了コード 34304 が返されました。まず、8 ビット分シフトする必要があります。結果は35304 >> 8 == 134、abort シグナルで強制終了されたジョブの終了コードです。segfault が原因で失敗した場合は、代わりに 139 が返されます。

終了コードの概要へのリンクを次に示します。

最後に、core_dumpテストに使用する のソース コードを次に示します。

#include <cstdlib>

int main() {
  abort();
  return 0;
}
于 2013-01-08T19:22:10.647 に答える
1

Linux 終了コードについては、次の質問で説明します: Linux には標準の終了ステータス コードがありますか?

IIRC system() の戻り値は、生成されたプロセスの終了コードに対応する必要がありますが、それはあなたの観察に反するように見えます。変。テストします。

編集:観察:

  1. system() の戻り値を確認できました。
  2. 35585 == 139 << 8 であることに注意してください。139 は、segfaulted プロセスの Linux 終了コードです。

次に、信頼できる回答を得るために glibc のソースを確認します...

于 2013-01-08T19:13:18.243 に答える
0

任意のコマンドの場合は? あまり。終了コードに意味を与えるかどうかは、各プログラム次第です。あなたが推測できる唯一のことは、成功の平均が 0 であることですが、それも単なる慣例であり、保証されているわけではありません。

于 2013-01-08T19:10:24.030 に答える