解放されたアドレスを使用しようとするプログラムがあります。これにより競合が発生します。私の考えでは、Linuxが誤った動作のためにプログラムを終了するので、これが起こると思います。解放されたメモリにアクセスすると警告メッセージが表示され、プログラムの実行が続く快適な環境でプログラムを実行する方法はありますか?
答え1
プロセスは、1970年代からUNIXカーネルに存在していた「シグナル」という機能によって終了します。違法なメモリにアクセスするためにプロセスが受信した信号は、SIGSEGV(Segmentation Violation)です。
ほとんどのシグナルはシャットダウンを引き起こしますが、プログラムは特定のタイプのシグナルを無視するか、シグナルが転送されるとシグナル処理ルーチンを実行するかを選択できます。すべての信号を無視または処理することはできませんが、SIGSEGVは可能です。
これはマニュアルページに文書化されています信号(2)そして信号(7)。しかし、質問にC ++でタグ付けしました。おそらくC ++には、signal
これを行うための独自のシステムコールベースのメカニズムがあります。
この記事を書いた後、StackoverflowでSIGSEGVをキャプチャするC ++プログラムを見つけました。https://stackoverflow.com/a/918891/3548109。
答え2
マップされていないメモリへのアクセスはアプリケーションの誤動作と見なされるため、これを終了することは絶対に正しいです。
他のプログラムがメモリにアクセスすると想像してください。あなたの一方、プログラムは...
ただし、MMUをサポートせずにコンパイルされた小さなLinuxを試すことができます(シングルユーザーシステムでのみ)。これらのシステムは悪意のあるメモリアクセスを可能にします。