Нужен ли O_LARGEFILE только для записи большого файла?

Нужен ли флаг O_LARGEFILE, если все, что я хочу сделать, это записать большой файл (O_WRONLY) или добавить в большой файл (O_APPEND | O_WRONLY)?

Из ветки, которую я прочитал под названием «Невозможно записать >2 ГБ index file" в списке рассылки CLucene-dev, похоже, что O_LARGEFILE может понадобиться для записи больших файлов, но участники этого обсуждения используют O_RDWR, а не O_WRONLY, так что я не уверен.


person Daniel Trebbien    schedule 22.05.2010    source источник


Ответы (2)


O_LARGEFILE никогда не должны использоваться приложениями напрямую. Он должен использоваться внутри совместимой с 64-битным смещением версией open в libc, когда она делает системный вызов ядру (Linux или, возможно, другому ядру с этим 64-битным-режимом-смещения-за-секунду). классовый вздор). Просто не забывайте всегда включать -D_FILE_OFFSET_BITS=64 в CFLAGS, и вам никогда не придется ни о чем беспокоиться.

person R.. GitHub STOP HELPING ICE    schedule 06.08.2010
comment
У вас есть какой-либо источник для того, что O_LARGEFILE не следует использовать? - person dmeister; 12.01.2012
comment
Лучшим источником является тот факт, что поиск POSIX для него дает нулевые результаты. - person R.. GitHub STOP HELPING ICE; 12.01.2012
comment
То есть вы имеете в виду, что O_LARGEFILE — это что-то вроде кепки? Должна быть какая-то причина, по которой этот флаг существует. - person kirugan; 29.06.2013
comment
В 32-битных системах версия open, используемая с -D_FILE_OFFSET_BITS=64, прозрачно передает O_LARGEFILE ядру. Версия, используемая с 32-битной off_t, этого не делает. Это, в свою очередь, определяет максимальное смещение, установленное в описании открытого файла на языке POSIX, что заставляет ряд функций сообщать об ошибках, когда они приводят к смещению файла, которое не может быть представлено в 32-битном off_t. Максимум связан с описанием открытого файла, а не с процессом, поскольку описания открытых файлов могут быть общими для процессов. - person R.. GitHub STOP HELPING ICE; 29.06.2013
comment
В любом случае, совершенно незачем тыкать в O_LARGEFILE себя. Если вы используете 64-разрядную версию off_t в 32-разрядной системе, она будет установлена ​​автоматически, а в противном случае (в 64-разрядной системе или в 32-разрядной системе с 32-разрядной off_t) ее не должно быть. набор. - person R.. GitHub STOP HELPING ICE; 29.06.2013
comment
Упоминается ли POSIX _FILE_OFFSET_BITS? Можете ли вы дать ссылку на него? - person Ciro Santilli 新疆再教育营六四事件ۍ 14.08.2017
comment
Нет, это вещь glibc. Разумные системы всегда используют 64-битные смещения. POSIX допускает несколько сред, и команда getconf может сообщить вам CFLAGS для конкретной среды. - person R.. GitHub STOP HELPING ICE; 14.08.2017

IIRC, если вы это сделаете

#define _LARGEFILE_SOURCE
#define _FILE_OFFSET_BITS 64

перед всеми другими включениями вам не нужно передавать этот флаг.

см. дополнительно

person codymanix    schedule 22.05.2010
comment
_LARGEFILE_SOURCE не нужен, только _FILE_OFFSET_BITS. - person R.. GitHub STOP HELPING ICE; 10.08.2011