LINUX.ORG.RU

_FILE_OFFSET_BITS вкуда?

 


0

1

Приветствую, опять мучения с GCC ))

Вроде уже запихал во все места этот дефайн, не указывал только при компиляции

#define _FILE_OFFSET_BITS 64

один фиг ftell вываливается на больше 2гб с

Value too large for defined data type

★★★

-D_FILE_OFFSET_BITS=64

тоже не прокатывает… как указать чтоб на 32 битной начал большие файлы читать???

wolverin ★★★
() автор топика

Не скажу за linux, но в солярке вдобавок к этому нужно:

-D_LARGEFILE_SOURCE
dsdqmhsx
()

Потому что ftell deprecated уже десятки лет как. Используй ftello и хватит учить систему по книгам из 90-х. Аналогично забудь про fseek и используй fseeko.

Касательно же _FILE_OFFSET_BITS, идея ставить его именно флагом компилятора (-D_FILE_OFFSET_BITS=64) правильная, иначе кучу лишней возни получаешь. Причём если у тебя есть где-то список дефолтных флагов - пропиши его туда, собирать программы без него смысла нет.

Ах да

Приветствую, опять мучения с GCC ))

мучения не с GCC, а с линуксовой реализацией stdio. В FreeBSD кстати этой проблемы нет, там off_t всегда 64-битный кроме совсем древних версий.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 4)
Ответ на: комментарий от firkax

firkax

ftell deprecated

как то не приходилось с больше 2гб файлами работать…

чудно, _FILE_OFFSET_BITS влияет только на ftello и fseeko

и снова спасибо Вам!

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)
Ответ на: комментарий от wolverin

64-битный off_t позволяет адресовать до 2^64 байт, что примерно 16000000 терабайт.

чудно, _FILE_OFFSET_BITS влияет только на ftello и fseeko

Ещё на lseek/pread/pwrite, но это не stdio а системные вызовы.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от wolverin

Для off_t нет гарантии, что он всегда 64-разрядный, на него есть только требование, что off_t shall be signed integer types. Поэтому в некоторых случаях могут вылезать проблемы.

Из книги Linux System Programming, Robert Love от 2013 года:

On error, lseek() returns −1 and errno is set to one of the following four values:

...

EOVERFLOW
The resulting file offset cannot be represented in an off_t . This can occur only on
32-bit architectures. Currently, the file position is updated; this error indicates just
that it is impossible to return it.

...

Limitations
The maximum file positions are limited by the size of the off_t type. Most machine
architectures define this to be the C long type, which on Linux is always the word size
(usually the size of the machine’s general-purpose registers). Internally, however, the
kernel stores the offsets in the C long long type. This poses no problem on 64-bit
machines, but it means that 32-bit machines can generate EOVERFLOW errors when per‐
forming relative seeks.

Ещё замечания из книги «LINUX API ИСЧЕРПЫВАЮЩЕЕ РУКОВОДСТВО», МАЙКЛ КЕРРИСК, 2018 год:

Если аргументы функции, имеющие тип off_t или stat, передаются между отдельно откомпи­
лированными модулями, необходимо обеспечить использование в обоих модулях одинако­
вых размеров для этих типов (то есть оба должны быть скомпилированы либо с установкой
для _FILE_OFFSET_BITS значения 64, либо без этих установок).
Значения ограничений, которые не имеют представления
В некоторых средах программирования типа данных rlim _t может быть недостаточно
для представления всего диапазона значений, предусмотренных для определенного огра­
ничения на ресурсы. Это случается в системах, которые предоставляют несколько сред
программирования с разными размерами типа rlim _t. Эта проблема обычно возникает,
когда среда компиляции с поддержкой больших файлов, в которой структура o ff_ t за­
нимает 64 бита, интегрируется в систему, где значения o ff_ t традиционно 32-битные
(в обеих средах размеры rlim _ t и o ff_ t совпадают). Это приводит к ситуации, когда
процесс с 32-битным типом данных rlim _t, если он запущен программой с 64-битной
структурой off_t, может наследовать ограничение на ресурсы (например, ограничение
на размер файла), которое превышает максимальное значение rlim _t.

Читайте книги, короч.

agentgoblin
()
Ответ на: комментарий от wolverin

чудно, _FILE_OFFSET_BITS влияет только на ftello и fseeko

long ftell(FILE *stream);

off_t ftello(FILE *stream);

Действительно, с чего бы это? /* табличка «сарказм» */

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