LINUX.ORG.RU

lseek64 - что нужно для успешной работы?


0

0

Есть i386 VirtualPC ASPLinux 7.3 Ядро - 2.4.18 GCC - 3.4.6 glibc - 2.3.2

Компилируем с опциями -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE

Программа открывает файл с флагом O_LARGEFILE (блочное устройство жесткого диска 13 Гб) и просто сдвигается. lseek64 возвращает ошибку

Но для ARM Based board - AT91RM9200 Ядро - 2.4.27-vrs1-ATMEL GCC - 2.95.3 ARM UClibC - 0.9.27 с опциями поддержки больших файлов

Тажа самая прграмма успешно работает.

Вопрос: Что надо "подкрутить" в i386 системе что бы lseek64 верно позицианировалась по файлу?

Все кроме gcc устанавливалось из rpm пакетов от ASPLinux

p.s. Система "старая" так как для компиляции программ под ARM ее вполне хватает, а больше ни для чего она не используется.

Спасибо. Игорь.


> lseek64 возвращает ошибку

strace'ом можно уточнить код возврата
может используется off_t вместо off64_t?

Chubaka
()
Ответ на: комментарий от mky

Из /usr/src/linux/fs/read_write.c, функция generic_file_llseek:


        retval = -EINVAL;                                                       
        if (offset>=0 && offset<=file->f_dentry->d_inode->i_sb->s_maxbytes) {   
                if (offset != file->f_pos) {                                    
                        file->f_pos = offset;                                   
                        file->f_reada = 0;                                      
                        file->f_version = ++event;                              
                }                                                               
                retval = offset;                                                
        }                                                                       
        return retval;


Из /usr/src/linux/asm/errno.h

#define EINVAL          22      /* Invalid argument */ 

mky ★★★★★
()
Ответ на: комментарий от mky

Возврат с ошибкой - из за неверного преобразования типов

Вот если написать (off64_t)((off64_t)1<<34)) тогда возвращается значение не меньше 0.

Но сдвигает она явно не туда куда я ее прошу. Так как потом функция чтения выдает такую чуууушь.

Всмысле данных на реальной задаче. а вот под армом все чистенко и так как нужно....

Но при всех етих флагах компиляции (как для i386 так и для arm) off_t - 4 байта size_t - 4 байта

off64_t - 8 байт

следовательно если я размер файла буду палучать через стат, а не через ioctl я получу неверный резултат.

Какого флага нехватает?

P_Igorek
() автор топика
Ответ на: комментарий от Chubaka

А может в ядре дело? Очень не хочетс менять, но все же?

Это ведь системный вызов и на другом ядре под другой архетиктурой работает.

P_Igorek
() автор топика
Ответ на: комментарий от Chubaka

Там где арм жесткий диск 20 Гб 512 блоками работает Там где virtual диск 13 Гб и тоже вроде как 512 блоками

P_Igorek
() автор топика
Ответ на: комментарий от P_Igorek

тебе же mky * (*) (22.05.2007 12:54:44) уже все объяснил

dilmah ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.