子プロセスがsegfaultされたことを検出するように設計されたコードをテストしています。このコードが常にセグメンテーション違反ではないことに驚いたと想像してみてください。
#include <stdio.h>
int main() {
char *p = (char *)(unsigned long)0;
putchar(*p);
return 0;
}
私はDebianLinux2.6.26カーネルで実行しています。私のシェルはksh93
Debianksh
パッケージのAT&T、バージョンM 93s+2008-01-31です。このプログラムはセグメンテーションフォールトを起こすこともありますが、それ以外の場合は、ゼロ以外の終了ステータスでサイレントに終了しますが、メッセージは表示されません。私の信号検出プログラムは次のことを報告します:
segfault terminated by signal 11: Segmentation fault
segfault terminated by signal 53: Real-time signal 19
segfault terminated by signal 11: Segmentation fault
segfault terminated by signal 53: Real-time signal 19
segfault terminated by signal 53: Real-time signal 19
segfault terminated by signal 53: Real-time signal 19
segfault terminated by signal 53: Real-time signal 19
純粋な状態で実行するksh
と、セグメンテーション違反もまれであることがわかります。
Running...
Running...
Running...
Running...
Running...
Running... Memory fault
Running...
興味深いことに、bash
毎回セグメンテーション違反を正しく検出します。
2つの質問があります:
誰かがこの振る舞いを説明できますか?
実行のたびに確実にセグメンテーション違反を起こす単純なCプログラムを誰かが提案できますか?私も試し
kill(getpid(), SIGSEGV)
ましたが、同様の結果が得られました。
編集:jbcreixには答えがあります:私のセグメンテーション違反検出器が壊れていました。ksh
同じ問題があるので私はだまされました。私は試してみてbash
、bash
毎回それを正しくしました。
私のエラーは、私がゼロを通過するはずだった場所に通過WNOHANG
していたことでした。waitpid()
何を考えていたのかわからない!何が問題なのか疑問に思う人もいますがksh
、それは別の質問です。