4
セグメンテーションフォールトは内部でどのように機能しますか?
「CPUのMMUが信号を送信する」と「カーネルが問題のあるプログラムにそれを送り、それを終了する」以外に、これに関する情報を見つけることができないようです。 私はそれがおそらくシグナルをシェルに送信し、シェルが問題のあるプロセスを終了して印刷することによってそれを処理すると仮定しました"Segmentation fault"。そのため、crsh(crap shell)と呼ばれる非常に最小限のシェルを作成して、この仮定をテストしました。このシェルは、ユーザー入力を取得してsystem()メソッドに渡すこと以外は何もしません。 #include <stdio.h> #include <stdlib.h> int main(){ char cmdbuf[1000]; while (1){ printf("Crap Shell> "); fgets(cmdbuf, 1000, stdin); system(cmdbuf); } } そこで、私はこのシェルを裸の端末でbash実行しました(下で実行せずに)。次に、セグメンテーション違反を生成するプログラムを実行しました。私の仮定が正しければ、これはa)クラッシュcrsh、xtermのクローズ、b)印刷しない"Segmentation fault"、またはc)両方のいずれかです。 braden@system ~/code/crsh/ $ xterm -e ./crsh Crap Shell> ./segfault Segmentation fault Crap Shell> [still running] 正方形に戻って、私は推測する。これを行うのはシェルではなく、その下のシステムであることを示しました。「セグメンテーション違反」はどのように印刷されますか?「誰」がやっているの?カーネル?他に何か?信号とそのすべての副作用は、ハードウェアからプログラムの最終的な終了までどのように伝播しますか?