LINUX.ORG.RU

[C]write упирается в 2147483647

 


0

0

Файловая систем ext3. Пишу в цикле много данных в файл обычным write'ом

int outfd = open( out_file_name, O_WRONLY|O_CREAT|O_TRUNC, 0644 );
while(!stopped)
{
  int byte_written = write( outfd, buf, bufsize );
}
При достижении размера в 2147483647 вываливается ошибка «File too large». getrlimit говорит, то ограничение на размер файла стоит в 4 гига
struct rlimit rlp;
if( 0 == getrlimit(RLIMIT_FSIZE, &rlp) )
  cout << rlp.rlim_cur << " " << rlp.rlim_max << endl;
Но этого все равно будет мало. Как писать файлы по 20+ гигов?

★★

Ответ на: комментарий от hizel

Пишу блоками по два килобайта: [code=C]const int buffsize = 2048; char buf[buffsize] = {0};[/code]

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

Может быть так?

int outfd = open( out_file_name, O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0644 );

edigaryev ★★★★★
()

LARGE_FILE спасет тебя. Иначе у тебя seek переполняется.

MuZHiK-2 ★★★★
()

Ага, O_LARGEFILE помог. Только почему о нем в man open ничего не сказано?.. Вот и читай после такого маны.

kulti ★★
() автор топика
#define _FILE_OFFSET_BITS 64
#define _LARGEFILE64_SOURCE
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
#include <linux/unistd.h>
main(){
	int f = open("tmp", O_WRONLY|O_CREAT|O_LARGEFILE, 0666);
	char a = 0;
	lseek(f, 0xFFFFFFFELL, SEEK_SET);
	write(f, &a, 1);
	close(f);
}

Еще проще: поставить 64-битную систему. Тогда у вас off_t будет 64-битным по умолчанию, и никакие доп. флаги использовать не придется.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от kulti
man open
... 
O_LARGEFILE
               На 32-битных системах, поддерживающих Большие Файловые Системы, этот флаг позволяет открывать файлы, длина которых не помещается в 31 бит.

читайте внимательнее :)

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от kulti

Все-таки, если вам надо часто работать с большими объемами памяти (например, сделать malloc на 3Гб) или большими файлами, лучше поставить 64-битную систему и не париться :)

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