На днях столкнулся с проблемой: код, который читает директорию, работал каким-то странным образом. Перебирались несколько файлов, находящихся внутри директории, но в какой-то момент чтение прекращалось, даже не возвращая никакой ошибки. Надо сказать, что вообще там было использование библиотеки APR для чтения, так что я не мог быстро заглянуть “внутрь” нее, чтобы понять: что не так. Проблема оказалась проста — в директории был файл размером 2.5 Гб. Мне показалось странным, что файловая система спокойно создает и работает с более крупными файлами, а я — нет
.
Таким образом я узнал о Large File Support в linux. В 32-битных ОС размер файла ограничен 32 битами… а так как размер сделали знаковым, то он стал ограничен 31 битом или 2 Гб. Этот “барьер” можно обойти. В 32-битных ОС есть специальный “64 битный интерфейс” для работы с файловой системой. Он позволяет производить все те же операции над файловой системой, только без ограничения размера файла (реальный максимальный размер файла при 64-битном интерфейсе определяется файловой системой и ОС). Чтобы на него переключиться необходимо скомпилировать весь свой код (конечно который использует I/O операции) с указанием определенных макросов. Эти макросы так же зависят от платформы. Чтобы их получить надо вызвать:
$getconf LFS_CFLAGS
Обычно эти флаги такие:
- Linux
- Solaris
- AIX
-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
Определение флага _FILE_OFFSET_BITS=64 конфликтует с загловочным файлом <procfs.h>. Можно переопределить его как _FILE_OFFSET_BITS=32 (что конечно отрубит поддержку LFS), если требуется использовать <procfs.h>.
-D_LARGE_FILES -D_LARGE_FILE_API
На моем AIX посмотреть значение переменной LFS_CFLAGS не удалось. Потому, я поискал в google какие флаги она обычно скрывает, тут указаны именно они.




Discussion