LINUX.ORG.RU

[64-bit]write() >2Gb

 


0

0

Вытащите меня из танка. Актуальное ядро позволяет написать/прочитать больше 2Gb за один вызов write()/read() ?

В SLES10x64 (ведро 2.6.16) - нет.

★★★★★

The number of bytes written may be less than count if, for example, there is insufficient space on the underlying physical medium, or the RLIMIT_FSIZE resource limit is encountered (see setrlimit(2)), or the call was interrupted by a signal handler after having written less than count bytes.

Led ★★★☆☆
()

Даже, если оно вдруг и позволяет, то не факт, что оно у тебя за раз действительно прочитает/запишет. Ты ведь не сможешь заставить пыхтеть вызов, пока он тебе 2 гига не испишет?

MuZHiK-2 ★★★★
()
Ответ на: комментарий от MuZHiK-2

если оно *вдруг позволяет* то код будет проще в 5 раз. Пока приходится писать 10 Гб файл за 5 приёмов с помощью pwrite64()

sS ★★★★★
() автор топика
Ответ на: комментарий от sS

На Lenny, 32-битовом ядре 2.6.32 - нет.

#include <fcntl.h>
#include <errno.h>

int main()
{
        int fd = open("/dev/zero", O_RDONLY);
        char *t = malloc(1024*1024*1024*2u+1024);

        printf("%p\n", t);
        errno = 0;
        read(fd, t, (size_t)(1024*1024*1024*2u));
        perror("read");
}
0x3762b008
read: Invalid argument

Если поставить размер чтения на 1024 меньше, начинает работать.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

>read(fd, t, (size_t)(1024*1024*1024*2u));

ясен пень тут же каститнг явный и не явный к size_t который 32 бит в 32 битной системе

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

>#define _LARGE_FILE_API

cиё актуально только для 32-бит систем для доступа к *64() версиям функций. В 64-бит системах это просто алиасы на дефолтовые функции.



sS ★★★★★
() автор топика
Ответ на: комментарий от sS

>>если оно *вдруг позволяет* то код будет проще в 5 раз. Пока приходится писать 10 Гб файл за 5 приёмов с помощью pwrite64()

А где гарантия, что оно именно за один прием запишет? Все равно придется проверять и дописывать в случае необходимости.

MuZHiK-2 ★★★★
()
Ответ на: комментарий от xtron

> ясен пень тут же каститнг явный и не явный к size_t который 32 бит в 32 битной системе

Ясен пень, что беззнаковый 32-битный целый тип позволяет задать размер до 4 гигабайт.

tailgunner ★★★★★
()
Ответ на: комментарий от frey

>Посмотри в ядре условие, почему нельзя больше. Время, конечно, придется потратить. %)

Лень :) Если мне склероз не изменяет там была заглушка в sendfile()

sS ★★★★★
() автор топика
Ответ на: комментарий от sS

s/заглушка в sendfile()/заглушка, связанная с sendfile()/

sS ★★★★★
() автор топика
Ответ на: комментарий от Reset

спс, значит пока не выпилили из актуальных этот лимит. Вопрос закрыт.

sS ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

>Ясен пень, что беззнаковый 32-битный целый тип позволяет задать размер до 4 гигабайт.

может внутри size_t к long int приводиться

xtron
()
Ответ на: комментарий от sS

>если оно *вдруг позволяет* то код будет проще в 5 раз.

write в любом случае не гарантирует запись всего объева за раз

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

write в любом случае не гарантирует запись всего объева за раз

Случаи негарантирования рассмотрены в первом каменте. Все они гарантируют незапись вообще (недописанный образ в моём случае не имеет смысла вообще)

PS: Собственно вопрос возник при перетряхивании старого кода где синк огромного образа задачи разбит на два случая:

1) Данных > 2Gb 2) Данных < 2Gb

Во втором случае кода в 5 раз меньше.

PS: Собственно дело в

/*
 * rw_verify_area doesn't like huge counts. We limit
 * them to something that fits in "int" so that others
 * won't have to do range checks all the time.
 */
#define MAX_RW_COUNT (INT_MAX & PAGE_CACHE_MASK)
sS ★★★★★
() автор топика
Ответ на: комментарий от xydo

>даже если и так, рассчитывать на это - верх криворукости.

Я смотрю тут телепаты подтянулись :)

sS ★★★★★
() автор топика
Ответ на: комментарий от xtron

>write в любом случае не гарантирует запись всего объева за раз

Была вроде длительная дискуссия по этому поводу.

http://www.linux.org.ru/jump-message.jsp?msgid=4719110&cid=4723447

Пришли вроде к выводу, что если пишем в обычный файл на диске, то гарантируется запись за один раз.

Поправьте если что не так.

pathfinder ★★★★
()

О при открытии и/или записи разве не нужно указывать | O_LARGEFILE, чтобы смещения были 64-битными?

annoynimous ★★★★★
()
Ответ на: комментарий от annoynimous

open64() для открытия файла попробуй. Или я не о том?

annoynimous ★★★★★
()
Ответ на: комментарий от pathfinder

>Поправьте если что не так.
там про прерывание сигналом,а я о том что когда ты говоришь write() записать скажем 100 байт - совершенно не факт что они запишутся за один раз. могут записаться 10 байт например и придется еще раз вызвать write() который в это раз например запишет 80 байт и придется еще раз вызвать write() который например запишет 10 байт - и того 100 байт записались за три вызова write() или за один или за сто - никто не знает сколько их потребуется.

xtron
()

Приветствую

А такой вариант пробовали:
%getconf LFS_CFLAGS
-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
%gcc -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 ...

?

psi
()
Ответ на: Приветствую от psi

>А такой вариант пробовали:

Это ровно по предыдущей ссылке. Я таки залез в ядро (не последнее но более менее актуальное) и привёл ниже MAX_RW_COUNT

sS ★★★★★
() автор топика
Ответ на: комментарий от xtron

>там про прерывание сигналом,а я о том что когда ты говоришь write()

Там именно про то, что если пишешь блок данных в регулярный файл, то он либо запишется целиком, либо произойдет критическая ошибка. А ситуация с записью данных кусками невозможна. Т.е. эта операция будет атомарна.

Вот у сокетов и COM-портов ситуация иная.

pathfinder ★★★★
()
Ответ на: комментарий от xtron

>там про прерывание сигналом,а я о том что когда ты говоришь write() записать скажем 100 байт - совершенно не факт что они запишутся за один раз

Шаман-вендузятнег ? :) У любого явления есть *причины*.

sS ★★★★★
() автор топика
Ответ на: комментарий от sS

>У любого явления есть *причины*.

правда? write() может работать так как я описал, не учитывать это - все равно что не учитывать коды возврата

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