2011-01-23 3 views
0
#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の:lseek64を作成するには_actually_は64ビットのオフセットを返しますか?

$ 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 

メジャーなワードを切り落とすことなく、サイズを正しく取得するために何をすべきでしょうか?

答えて

3

_FILE_OFFSET_BITS_LARGEFILE64_SOURCEの間に、sys/types.hとunistd.hを含むの前に定義してください。好ましくは、あなたのコンパイラのコマンドラインで。

+0

はい、前です。以前はコメントしかありません。 –

+0

... Hovever sys/types.hとunistd.hはまったく含まれていません。不可欠な間違いは、「壁」を忘れることです。 –

関連する問題