#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;
}