LINUX.ORG.RU

std::fstream падает при записи в файл ~2.2 Gb


0

0

std::fstream падает при записи в файл ~2.2 Gb

Как пофиксить?

Это не катит:
g++ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 bug.cpp

$ g++ -v
gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-20)
$ g++ bug.cpp
$ ./a.out
File size limit exceeded (core dumped)

$ gdb ./a.out core.22969
GNU gdb Red Hat Linux (5.3.90-0.20030710.40rh)

Core was generated by `./a.out'.
Program terminated with signal 25, File size limit exceeded.
Reading symbols from /usr/lib/libstdc++.so.5...done.
Loaded symbols for /usr/lib/libstdc++.so.5
Reading symbols from /lib/tls/libm.so.6...done.
Loaded symbols for /lib/tls/libm.so.6
Reading symbols from /lib/libgcc_s.so.1...done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/tls/libc.so.6...done.
Loaded symbols for /lib/tls/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
#0 0xb75ebc32 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
(gdb)
(gdb) bt
#0 0xb75ebc32 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
#1 0xb749a273 in __write_nocancel () from /lib/tls/libc.so.6
#2 0xb74377af in _IO_new_file_write () from /lib/tls/libc.so.6
#3 0xb743674e in new_do_write () from /lib/tls/libc.so.6
#4 0xb74366e6 in _IO_new_do_write () from /lib/tls/libc.so.6
#5 0xb7436f9a in _IO_new_file_sync () from /lib/tls/libc.so.6
#6 0xb742b77b in fflush () from /lib/tls/libc.so.6
#7 0xb75b8ce1 in std::__basic_file<char>::sync() ()
from /usr/lib/libstdc++.so.5
#8 0xb756ed08 in std::basic_filebuf<char, std::char_traits<char> >::_M_really_overflow(int) () from /usr/lib/libstdc++.so.5
#9 0xb756f29b in std::basic_filebuf<char, std::char_traits<char> >::sync() ()
from /usr/lib/libstdc++.so.5
#10 0xb759e959 in std::ostream::flush() () from /usr/lib/libstdc++.so.5
#11 0xb759ed1f in std::basic_ostream<char, std::char_traits<char> >& std::flush<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&) () from /usr/lib/libstdc++.so.5
#12 0xb759d52c in std::ostream::operator<<(std::ostream& (*)(std::ostream&)) ()
from /usr/lib/libstdc++.so.5
#13 0x08048afc in main () at bug.cpp:25

// bug.cpp

#include <stdio.h>
#include <stdlib.h>

#include <string>
#include <iostream>
#include <fstream>

using namespace std;

int main(void)
{
try
{
fstream fs;

fs.open("test.log", ios::out | ios::app);

if(!fs.is_open()) {
cout << "Error: failed to open 'test.log'\n";
return 1;
}

for(int i=0; i<100000000; i++)
{
fs << "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
<< flush;

if(fs.fail() || !fs.good()) {
cout << "Error: failed to write to stream!\n";
break;

fs.sync();
}
fs.close();
}
catch(...)
{
cout << "Exception!\n";
}

return 0;
}

anonymous

Поправка к коду:
if(fs.fail() || !fs.good()) { 
   cout << "Error: failed to write to stream!\n"; 
   break;
}

Kernel: 2.4.21-4.ELsmp #1 SMP

anonymous
()

man ulimit Ясно же сказано -- File size limit exceeded. Т.е. превышен максимально допустимый размер файла. И система убивает процесс с помощью SIGXFSZ

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

ничего подобного:

$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited file size (blocks, -f) unlimited max locked memory (kbytes, -l) 4 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 7168 virtual memory (kbytes, -v) unlimited

проблема в другом.

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

Например, в квотах. (Я точно не помню, какой сигнал отправляется процессу при превышении жесткой квоты, но SIGXFSZ было бы логично). Очевидно то, что трабла не в самой программе, а в настройке системы.

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