現在ファイルを開き、fread()でファイルを読み取って、メモリマップトファイルを使用するツールを変更しています。このプログラムは、I/Oエラーが発生している可能性のあるデバイスから頻繁に読み取ります。現在、fread()によって返されるエラーでこれらをキャッチしています。I / Oエラーはメモリマップトファイルでどのように報告されますか?
2 に答える
vy32によって参照されるLinuxのマニュアルページには、書き込みの失敗(ディスク容量がないなど)で生成されることが明示的に記載されSIGSEGV
ていますが、読み取りの失敗でそのようなエラーが発生するかどうか(リムーバブルメディアが物理的に削除された場合など)は不明です。ウィキペディアはそれについてより具体的であるようです:
マップされたメモリへのアクセス中の基になるファイルのI/Oエラー(たとえば、リムーバブルドライブが接続されていない、光メディアが排出されている、書き込み時にディスクがいっぱいになっているなど)は、POSIXのSIGSEGV/SIGBUS信号としてアプリケーションに報告されます。 WindowsでのEXECUTE_IN_PAGE_ERROR構造化例外。マップされたメモリにアクセスするすべてのコードは、メモリにアクセスするときに通常は発生しないこれらのエラーを処理するように準備する必要があります。
のPOSIX仕様でmmap
は、信号がエラー時に配信される必要はありませんが、実装にはそのような可能性があります。
実装は、参照によってマップされたオブジェクトにスペース不足状態などのエラーが発生した場合に、SIGBUSシグナルを生成する場合があります。
使用できないマップトメモリにアクセスしようとすると、 SIGSEGVまたはSIGBUSが生成されたようです。