Ошибка шины (SIGBUS) при чтении пустого файла с помощью mmapLinux

Ответить
Anonymous
 Ошибка шины (SIGBUS) при чтении пустого файла с помощью mmap

Сообщение Anonymous »


Я использую mmap() для чтения файла, который часто изменяется другим процессом. Я заметил, что при очистке файла (его размер становится равным 0) в процессе чтения возникает ошибка шины (SIGBUS). Проверка размера файла перед вызовом mmap бесполезна, поскольку файл может быть очищен в любой момент при доступе к памяти, отображенной с помощью mmap, что все равно приведет к ошибке шины.

int fd = open("test.data", O_RDONLY, 0); void* addr = mmap(NULL, 32, PROT_READ, MAP_SHARED, fd, 0); для ( int я знак равно 0; я < 32; ++i ) { // Эта строка может вызвать ошибку шины при очистке файла. printf( "%d %d\n", i, int( *( ( char* )addr + i ) ) ); } Игнорирование SIGBUS путем изменения обработчика сигнала с помощью signal() — обходной путь, но он влияет на весь процесс. Мне интересно, есть ли лучший способ справиться с этой ситуацией.

Пояснение ситуации: Моя программа получает данные о фондовом рынке в режиме реального времени с фондовой биржи. Программа фондовой биржи получает данные со своего сервера и обновляет эти данные в текстовый файл. Моей программе необходимо постоянно сканировать файл данных. Это устаревший способ распространения рыночных данных, но он все еще поддерживается некоторыми фондовыми биржами.

Чего я ожидаю: Если использование SIGBUS считается плохой практикой, существуют ли другие технические методы для обеспечения стабильности (только во избежание сбоев)? Можно ли «заблокировать» файл исключительно в процессе чтения, не внося изменений в процесс записи? Если такой альтернативы не существует, возможно, потребуется связаться с провайдером процесса записи для получения дополнительной информации.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»