help-gplusplus
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: File Size Limit Exceeded G++ Linux


From: Paul Pluzhnikov
Subject: Re: File Size Limit Exceeded G++ Linux
Date: Sun, 16 Apr 2006 10:46:39 -0700
User-agent: Gnus/5.1006 (Gnus v5.10.6) XEmacs/21.4 (Jumbo Shrimp, linux)

Robert Heller <heller@deepsoft.com> writes:

>   "Peter Nolan" <peter@peternolan.com>,
>   In a message on 14 Apr 2006 07:10:59 -0700, wrote :
>
> "N> Hi All,
> "N> I am running some C++ I wrote having been compiled in G++. When writing
> "N> to a file I get 'file size limit exceeded' as a message when the file
> "N> size gets to 2,147,483,647.

Are you using 'std::fstream', 'FILE*', or 'int fd' to write these files?

Using 'fstream', I get the same behavior as you do, regardless
of whether I use '-D_FILE_OFFSET_BITS=64'.

Using 'FILE *', I get "File size limit exceeded" without
-D_FILE_OFFSET_BITS=64, but can write 4GB file when compiled with
-D_FILE_OFFSET_BITS=64.

[In the process of experimentation, I have corrupted my old reiserfs
/home filesystem, which is why my reply is 2 days late ;-[

Since 'fstream::write' calls 'fwrite' to do the actual writing,
the problem must be in how libstdc++ was compiled.

In fact, looking at strace output, I observe:

  // using std::fstream
  open("junk.out", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3

  // using fopen()/fwrite()
  open("junk.out", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3

Running under debugger, I see that std::fstream version calls
fopen@GLIBC_2.1, while the fopen()/fwrite() version calls fopen64().

Looking further into gcc-3.4.0/libstdc++ sources, I see this:

  __basic_file<char>::open(const char* __name ...
#ifdef _GLIBCXX_USE_LFS
        if ((_M_cfile = fopen64(__name, __c_mode)))
#else
        if ((_M_cfile = fopen(__name, __c_mode)))
#endif

So, to solve the problem, you must rebuild libstdc++ with
-D_GLIBCXX_USE_LFS. It appears, that newer versions of g++ (at
least 3.4.0) automatically check for and enable this, but the
default g++ 3.3.3 (as shipped with Fedora Core 2) either didn't,
or was compiled on a non-LFS filesystem.

> Exactly what version of red hat linux are you using?  Which kernel
> version?  Which GLibc version?

This is likely irrelevant -- other programs *can* write large files:

> "N> We have tried creating larger
> "N> files with other programs and they work ok

which means his kernel and glibc are perfectly fine.

Cheers,
-- 
In order to understand recursion you must first understand recursion.
Remove /-nsp/ for email.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]