Ошибка шины (SIGBUS) при чтении пустого файла с помощью mmap ⇐ Linux
-
Anonymous
Ошибка шины (SIGBUS) при чтении пустого файла с помощью mmap
Я использую 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 считается плохой практикой, существуют ли другие технические методы для обеспечения стабильности (только во избежание сбоев)? Можно ли «заблокировать» файл исключительно в процессе чтения, не внося изменений в процесс записи? Если такой альтернативы не существует, возможно, потребуется связаться с провайдером процесса записи для получения дополнительной информации.
Я использую 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 считается плохой практикой, существуют ли другие технические методы для обеспечения стабильности (только во избежание сбоев)? Можно ли «заблокировать» файл исключительно в процессе чтения, не внося изменений в процесс записи? Если такой альтернативы не существует, возможно, потребуется связаться с провайдером процесса записи для получения дополнительной информации.
Мобильная версия