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
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.