Wie mache ich LSEEK64 _actucual_ zurückgegeben 64-Bit-Offset?
-
23-10-2019 - |
Frage
#define _FILE_OFFSET_BITS 64
#define _LARGEFILE64_SOURCE
...
off64_t st_size;
...
st_size = (off64_t)lseek64(fd, (off64_t)0, SEEK_END);
fprintf(stderr, "QQQ st_size=%llx %lld\n", st_size, st_size);
Dann Strace:
$ strace -e _llseek ./the_program
_llseek(3, 0, [20974464000], SEEK_END) = 0
QQQ st_size=ffffffffe22cec00 -500372480
- 20974464000 == 0x4e22Cec00 - Gut
- -500372480 == 0xffffffffffe22cec00 - schlecht
Es ändert sich zu (off64_t)lseek64(fd, 0, SEEK_END);
Es ruft _llseek falsch auf:
_llseek(3, 8589934592, [8589934592], SEEK_SET) = 0
st_size=0 0
Was sollte ich mehr tun, um sicherzustellen, dass sie die Größe korrekt erhält, ohne das große DWORD abzuhacken?
Lösung
Stellen Sie sicher, dass Sie definieren _FILE_OFFSET_BITS
und _LARGEFILE64_SOURCE
Vor einschließlich sys/typen.h und unistd.h. Vorzugsweise in der Befehlszeile des Compilers.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow