1
#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を切り落とすことなく、サイズが正しくなるようにするには、さらに何をすればよいですか?

4

1 に答える 1

5

sys / types.hとunistd.hを定義する前に_FILE_OFFSET_BITS、定義していることを確認してください。できれば、コンパイラのコマンドラインで。_LARGEFILE64_SOURCE

于 2011-01-23T03:49:41.943 に答える