Как сделать LSEEK64 _Actully_ возвращать 64-битное смещение?

StackOverflow https://stackoverflow.com/questions/4772182

Вопрос

#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 -e _llseek ./the_program
_llseek(3, 0, [20974464000], SEEK_END)  = 0
QQQ st_size=ffffffffe22cec00 -500372480
  • 20974464000 == 0x4e22cec00 - Хорошо
  • -500372480 == 0xffffffffe22cec00 - Bad

Это меняется на (off64_t)lseek64(fd, 0, SEEK_END); он вызывает _llseek неправильно:

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

Что еще я должен сделать, чтобы убедиться, что он получил правильный размер, не отрубив основной DWORD?

Это было полезно?

Решение

Убедитесь, что вы определяете _FILE_OFFSET_BITS а также _LARGEFILE64_SOURCE до в том числе sys/types.h и unistd.h. Предпочтительно, в командной строке вашего компилятора.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top