// you’re reading...

Featured

LFS в linux: работаем с файлами больше 2Гб

На днях столкнулся с проблемой: код, который читает директорию, работал каким-то странным образом. Перебирались несколько файлов, находящихся внутри директории, но в какой-то момент чтение прекращалось, даже не возвращая никакой ошибки. Надо сказать, что вообще там было использование библиотеки APR для чтения, так что я не мог быстро заглянуть “внутрь” нее, чтобы понять: что не так. Проблема оказалась проста — в директории был файл размером 2.5 Гб. Мне показалось странным, что файловая система спокойно создает и работает с более крупными файлами, а я — нет :-) .

Таким образом я узнал о Large File Support в linux. В 32-битных ОС размер файла ограничен 32 битами… а так как размер сделали знаковым, то он стал ограничен 31 битом или 2 Гб. Этот “барьер” можно обойти. В 32-битных ОС есть специальный “64 битный интерфейс” для работы с файловой системой. Он позволяет производить все те же операции над файловой системой, только без ограничения размера файла (реальный максимальный размер файла при 64-битном интерфейсе определяется файловой системой и ОС). Чтобы на него переключиться необходимо скомпилировать весь свой код (конечно который использует I/O операции) с указанием определенных макросов. Эти макросы так же зависят от платформы. Чтобы их получить надо вызвать:

$getconf LFS_CFLAGS

Обычно эти флаги такие:

  • Linux
  • -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64

  • Solaris
  • -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
    Определение флага _FILE_OFFSET_BITS=64 конфликтует с загловочным файлом <procfs.h>. Можно переопределить его как _FILE_OFFSET_BITS=32 (что конечно отрубит поддержку LFS), если требуется использовать <procfs.h>.

  • AIX
  • -D_LARGE_FILES -D_LARGE_FILE_API
    На моем AIX посмотреть значение переменной LFS_CFLAGS не удалось. Потому, я поискал в google какие флаги она обычно скрывает, тут указаны именно они.


Discussion

Ads

Похожие статьи