Hallo,
Am Sat, 04 Jun 2005, Christian Schneider schrieb:
Am Freitag, 3. Juni 2005 20:03 schrieb David Haller:
Welche Fehlermeldung(en) bekommst du denn? Und wie oeffnest du die
Datei? Und ist off_t auch 8 Byte gross?
Also, bei mir wollte g++ erst kompilieren, wenn ich zusätzlich den
streambuf header eingebunden habe. Dann kommt als Ausgabe auch 8 raus.
Das Öffnen der Datei habe ich mit
ifstream blabla("datei");
versucht. Als Resultat erhalte ich auf die Abfrage, ob blabla true ist,
ein false. Ich habe bei ifstream keine Möglichkeit gefunden, wie ich
weitere Infos zum Fehler erhalten kann (vielleicht gibt es welche, aber
ich habe ehrlich gesagt vor kurzem erst mit C++ richtig angefangen und
steh oft noch ziemlich ratlos rum, wenn was schief läuft).
Hm. C++ muesste ich jetzt auch nachlesen. Aber sinnvoll waere es wohl,
mal generell zu testen, ob es bei dir geht. Z.B. in C:
====
#define _LARGEFILE_SOURCE
#define _FILE_OFFSET_BITS 64
#include
#include
#include
#include
#include
int main(void) {
int fd;
char bigname[] = "/tmp/bigfile.XXXXXX";
printf("sizeof(off_t) = %i\n", sizeof(off_t)); /* should be 8 */
fd = mkstemp(bigname); /* get temp file */
if( fd ) {
/* seek to over 2 GB, this should be lseek64, just as off_t is
off64_t */
off_t offset = lseek(fd, (off_t)2247483648, SEEK_SET);
printf("lseek = %Lu\n", offset); /* should be 2247483648 (?) */
if(!offset) {
perror("");
close(fd);
unlink(bigname);
exit(errno);
}
{
ssize_t written = write(fd, bigname, 2);
perror(""); /* should be "Success" */
printf("write() = %i\n", written); /* should be 2 */
}
close(fd);
/* unlink(bigname); */ /* delete file -- or not */
} else {
perror("");
exit(errno);
}
return 0;
}
====
Achtung: ich habe das jetzt noch in der Mail etwas veraendert, kann
sein, dass da Fehler drin sind.
Wenn man sich die datei nach dem Aufruf nicht anschauen will sollte
man das 'unlink' entkommentieren.
Wenn es bei dir damit klappt, dann kann man gezielt schauen, wo's mit
C++ hakt... Bzw. warum's auch mit diesen Mitteln nicht klappt.
Aufpassen muss man nur, dass man nicht in die "sparse-file" Falle
laeuft, wo AFAIK Fehler auftreten, wenn die Datei "echt" ueber 2 GB
gross wird, d.h. man muesste > 2 GB schreiben...
Achso, du koenntest auch ein C-Proggie auf ne vorhandene Datei
loslassen... (im Prinzip 'open' statt dem 'mkstemp' und 'read' statt
'write' nach dem lseek oben (da musst du aber dem read noch nen Buffer
anlegen). Und natuerlich kein "unlink" (auch bei der Fehlerbehandlung
nicht) ;)
...
Bei mir klappt das uebrigens nicht, ich bekomme da
SIGXFSZ (File size limit exceeded)
und nen coredump.
$ uname -r
2.4.25-1l
$ /lib/libc.so.6 | head -n 1
GNU C Library stable release version 2.1.3, by Roland McGrath et al.
$ gcc --version
pgcc-2.95.3
$ ulimit -f
unlimited
Genau das gleiche aber auch mit:
$ LD_LIBRARY_PATH=/opt/gcc/3.3.5/lib /opt/gcc/3.3.5/bin/gcc --version
gcc (GCC) 3.3.5
Woran's bei mir liegt weiss ich leider auch nicht. AFAIK sind bei mir
eigentlich alle relevanten Teile LFS faehig (Kernel + Ext3, libc und
zumindest obiges Testprogramm ;) Und ich meine, ich haette sogar mal
ne Datei >2GB auf der Platte gehabt... Mein System sollte eben
inzwischen weitgehend LFS-faehig sein, aber irgendeine Altlast stoert
noch. Allerdings ist mein System auch inzwischen 6 Jahre alt :) Und
bisher hatte ich erst 2mal Bedarf fuer eine Datei > 2 GB (1 HDD Image
fuer jemand anderen und ein (unkomprimiertes) Video ;)
-dnh
--
Ja, es sieht wirklich düster aus in der deutschen Politik. Nachdem die letzten
Gesetze dermaßen zerschröddert wurde, dass selbst in der Union keiner mehr was
merkelt, bringt auch das rumgestoibere nichts. Und jetzt? Tritt ihn? Im Trüben
Fischern? Mal sehen, was uns die nächste Westerwelle bringt... -- Konni