如何使lseek64 _actually_返回64位偏移量?

Vi.*_*Vi. 1 linux libc ftell seek large-files

#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);
Run Code Online (Sandbox Code Playgroud)

然后strace:

$ strace -e _llseek ./the_program
_llseek(3, 0, [20974464000], SEEK_END)  = 0
QQQ st_size=ffffffffe22cec00 -500372480
Run Code Online (Sandbox Code Playgroud)
  • 20974464000 == 0x4E22CEC00-好
  • -500372480 == 0xffffffffe22cec00-错误

它更改为(off64_t)lseek64(fd, 0, SEEK_END);错误地调用_llseek:

_llseek(3, 8589934592, [8589934592], SEEK_SET) = 0
st_size=0 0
Run Code Online (Sandbox Code Playgroud)

我应该做些什么来确保它正确地获得大小,而不用砍掉主要的双字?

mik*_*dld 5

确保你定义_FILE_OFFSET_BITS_LARGEFILE64_SOURCE 之前包括SYS / types.h中和unistd.h中。最好在编译器的命令行中。