LINUX.ORG.RU

mmap для быстрого считывания файла


0

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

for (; *c; c++)
{
// сделать что-то с памятью по адресу c
}

Всё бы хорошо, но вот как быть с ситуацией, когда размер файла совпадает с размером страницы? Тогда нулей для того, чтобы выйти из цикла, не будет. Пытался mmap-ить на один байт больше, но попытка доступа к этой памяти приводит к SIGBUS, из которого не получается выйти из цикла, в результате чего программа зависает.
Может, лучше определить длину файла посредством stat и делать
for (i=0;i<size;i++) {
//...
}

?
anonymous
()
>Всё бы хорошо, но вот как быть с ситуацией, когда размер файла совпадает с размером страницы?

А ещё есть возможность, что нули будут в самом файле

kss ★★★★★
()
Ответ на: комментарий от anonymous
Но тогда надо передавать эту длину каждой функции... хотя, написав этот пост, я подумал, что можно сделать эту переменную глобальной, так как обработки нескольких файлов одновременно не предвидится.
RommeDeSerieux
() автор топика
Ответ на: комментарий от kss
> А ещё есть возможность, что нули будут в самом файле

тогда это не файл, а порнография какая-то:)

dilmah ★★★★★
()
Ответ на: комментарий от RommeDeSerieux
>Но тогда надо передавать эту длину каждой функции...
Дык так и надо. Чем меньше глобальных переменных - темь лучше, особенно в этом случае.
anonymous
()
Ответ на: комментарий от RommeDeSerieux
> Но тогда надо передавать эту длину каждой функции... хотя, написав этот пост, я подумал, что можно сделать эту переменную глобальной, так как обработки нескольких файлов одновременно не предвидится.

Если бы все интерфейсы строились подобным образом.. аля...

К примеру, вырезка из вымешленного man write(2):

Выставляете глобальные переменные write_fd, write_buf и write_len, делаете вызов write (без аргументов), и потом получаете значения через write_ret... ужоснах...

fmj
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.