【问题标题】:How to make lseek64 _actually_ return 64-bit offset?如何使 lseek64 _actually_ 返回 64 位偏移量?
【发布时间】:2011-01-23 03:43:31
【问题描述】:
#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);

然后是strace:

$ strace -e _llseek ./the_program
_llseek(3, 0, [20974464000], SEEK_END)  = 0
QQQ st_size=ffffffffe22cec00 -500372480
  • 20974464000 == 0x4E22CEC00 - 好
  • -500372480 == 0xffffffffe22cec00 - 坏

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

_llseek(3, 8589934592, [8589934592], SEEK_SET) = 0
st_size=0 0

我还应该做些什么来确保它得到正确的大小,而不切断主要的 dword?

【问题讨论】:

    标签: linux large-files libc seek ftell


    【解决方案1】:

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

    【讨论】:

    • 是的,它们是以前的。以前只有cmets。
    • ... 悬停 sys/types.h 和 unistd.h 根本不包括在内。根本的错误是忘记了“-Wall”。
    猜你喜欢
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多