6

現在ファイルを開き、fread()でファイルを読み取って、メモリマップトファイルを使用するツールを変更しています。このプログラムは、I/Oエラーが発生している可能性のあるデバイスから頻繁に読み取ります。現在、fread()によって返されるエラーでこれらをキャッチしています。I / Oエラーはメモリマップトファイルでどのように報告されますか?

4

2 に答える 2

3

vy32によって参照されるLinuxのマニュアルページには、書き込みの失敗(ディスク容量がないなど)で生成されることが明示的に記載さSIGSEGVていますが、読み取りの失敗でそのようなエラーが発生するかどうか(リムーバブルメディアが物理的に削除された場合など)は不明です。ウィキペディアはそれについてより具体的であるようです:

マップされたメモリへのアクセス中の基になるファイルのI/Oエラー(たとえば、リムーバブルドライブが接続されていない、光メディアが排出されている、書き込み時にディスクがいっぱいになっているなど)は、POSIXのSIGSEGV/SIGBUS信号としてアプリケーションに報告されます。 WindowsでのEXECUTE_IN_PAGE_ERROR構造化例外。マップされたメモリにアクセスするすべてのコードは、メモリにアクセスするときに通常は発生しないこれらのエラーを処理するように準備する必要があります。

のPOSIX仕様でmmapは、信号がエラー時に配信される必要はありませんが、実装にはそのような可能性があります。

実装は、参照によってマップされたオブジェクトにスペース不足状態などのエラーが発生した場合に、SIGBUSシグナルを生成する場合があります。

于 2019-01-25T18:55:18.897 に答える
1

使用できないマップトメモリにアクセスしようとすると、 SIGSEGVまたはSIGBUSが生成されたようです。

于 2011-07-25T01:39:09.840 に答える