![]() |
Модераторы: xvr |
![]() ![]() ![]() |
|
GrayCardinal |
|
||||||||||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
struct stat
Засада....... Берем ман
(специально привожу _всю_ структуру) Берем софтину.
При компиляции (g++-3.3 or g++-3.4) видим варнинг
Однако :
И что мы видим ? После бития башкой об стенку и сидения на реакторе ?
Внемение вопрос определен ли __USE_FILE_OFFSET64 по-дефолту и сколько бит в st_ino ? И знаете что я об этом думаю ? <censored> Вот такие пироги. Это сообщение отредактировал(а) GrayCardinal - 20.11.2006, 14:53 |
||||||||||
|
|||||||||||
MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
![]() Это сообщение отредактировал(а) MAKCim - 20.11.2006, 17:43 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
MAKCim,
Ага, я так и подумал ![]() |
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
printf ("%i\n", sizeof (st_buf.st_ino) * 8);
выдает 32 ![]() все, пошел вешаццо ... |
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
ЗЫ
Меня немного попустило когда strace выдал fstat64 вместо fstat ![]() Добавлено @ 19:07 Однако хочется заметить что в моих "архистабильных" манах (Debian 3.1) нет НИКАКОГО упомининия fstat64 ![]() |
|||
|
||||
MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
видно это дело не для прямого использования (у меня тоже не оказалось)
оно того не стоит ![]() видно дело в том, что при сдвиге на 32 старший бит 3-го байта выходит за диапозон, т. е теряется (что-то типа переполнения в сторону младших разрядов), непонятно только к чему warning ps. при сдвиге на 31 все OK -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 4 Всего: 317 |
а потом объясняй заказчику-овцеводу что программа записи баранов до 32 бит стоит
дешевле чем больше 32 бит ![]() -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
bilbobagginz,
![]() |
|||
|
||||
SynthEtic |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 19.11.2006 Где: Украина Репутация: нет Всего: нет |
fstat - обертка целой кучи функций, также как, например, mount - типа для тех же целей, что перегрузка функций в С++
strace показал конкретную функцию вызываемую из fstat, а именно - fstat64. И использовать fstat64 в коде в таком случае ессесна нельзя, т.к. полностью теряется портабельность (если такой код вообще скомпилируется (хотя, чего бы ему не скомпилиться???)) длина st_ino - 32 бита, т.к. тип его - ino_t, который определен как unsigned int варнинг g++ полностью понятен, ты сделал сдвиг на всю длину, т.е. если у тебя была переменная unsigned int i = 0xffffffff и ты сделаешь сдвиг на 32 разряда в любую сторону, то получишь вновь те же 0xffffffff, что вообщем-то не является еррором, но ворнингом - точно! потому что в результате сдвига ты потерял ВСЕ значащие разряды и теперь тебе с логической точки зрения просто нечего анализировать - отсюда ворнинг так что засады нет ![]() |
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
SynthEtic,
Да ну ?! Позвольте с вами не согласиться ! st_ino ну никак не может быть равен нулю. Ну вообще никак. а если printf ("%i %i", st_buf.st_ino) Первый будет ноль, а второй как раз номер INODE. (я для чего привел софтину и резУльтат ?) И не знаю я как это получается, но если бы он был 32 бита, такого бы небыло, а ? Добавлено @ 21:25 У меня там реально ноль был, чесслово. под 2.6.8-amd64 ядром ![]() Добавлено @ 21:26 Ща еще потестю, может правда глюк и этот люк в потолке не с простоа..... ![]() Это сообщение отредактировал(а) GrayCardinal - 21.11.2006, 21:17 |
|||
|
||||
GrayCardinal |
|
|||
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 8 Всего: 58 |
SynthEtic
А засада таки была (хотя st_ino и правда 4 байта ![]() printf ("%s; dev: %i; ino: %i\n", argv[1], st_buf.st_dev, st_buf.st_ino); ino = 0 получалось вот здесь. Короче такая шняга из-за st_dev который 64 бита (что опять таки нигде не написано) ![]() Это сообщение отредактировал(а) GrayCardinal - 21.11.2006, 21:42 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Программирование под Unix/Linux" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |