Как отображаемые в память файлы обрабатывают ошибки ввода-вывода? - PullRequest
4 голосов
/ 22 июля 2011

Я изменяю инструмент, который в настоящее время открывает файлы и читает их с помощью fread (), чтобы использовать отображенные в памяти файлы.Эта программа часто читает с устройств, которые могут иметь ошибки ввода-вывода.В настоящее время мы ловим их с ошибками, возвращаемыми функцией fread ().Как сообщать об ошибках ввода-вывода с отображенными в память файлами?

Ответы [ 2 ]

1 голос
/ 25 июля 2011

Хорошо, похоже, SIGSEGV или SIGBUS генерируется при попытке доступа к отображенной памяти, которая недоступна.

0 голосов
/ 25 января 2019

Справочная страница Linux , на которую ссылается vy32, прямо указывает, что SIGSEGV генерируется при ошибке записи (например, нет места на диске), но неясно, генерируют ли ошибки чтения такие ошибки (например, когда съемный носитель имеет были физически удалены). Википедия представляется более конкретной на этом:

Ошибки ввода-вывода в базовом файле (например, его съемный диск отключен или оптический носитель извлечен, диск заполнен при записи и т. Д.) При обращении к его отображенной памяти сообщаются приложению как сигналы SIGSEGV / SIGBUS в POSIX и структурированное исключение EXECUTE_IN_PAGE_ERROR в Windows. Весь код, обращающийся к отображенной памяти, должен быть подготовлен к обработке этих ошибок, которые обычно не возникают при обращении к памяти.

Спецификация POSIX mmap не требует доставки сигнала по ошибке, но оставляет такую ​​возможность для реализаций:

Реализация может генерировать сигналы SIGBUS, когда ссылка вызовет ошибку в отображаемом объекте, такую ​​как состояние вне пространства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...