Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> struct stat, засада 
:(
    Опции темы
GrayCardinal
Дата 20.11.2006, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



struct stat
Засада.......

Берем ман 

Цитата

--------
       They all return a stat structure, which contains the following fields:

              struct stat {
                  dev_t         st_dev;      /* device */
                  ino_t         st_ino;      /* inode */
                  mode_t        st_mode;     /* protection */
                  nlink_t       st_nlink;    /* number of hard links */
                  uid_t         st_uid;      /* user ID of owner */
                  gid_t         st_gid;      /* group ID of owner */
                  dev_t         st_rdev;     /* device type (if inode device) */
                  off_t         st_size;     /* total size, in bytes */
                  blksize_t     st_blksize;  /* blocksize for filesystem I/O */
                  blkcnt_t      st_blocks;   /* number of blocks allocated */
                  time_t        st_atime;    /* time of last access */
                  time_t        st_mtime;    /* time of last modification */
                  time_t        st_ctime;    /* time of last status change */
              };
---------

(специально привожу _всю_ структуру)

Берем софтину.

Код

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>

int main (int argc, char ** argv)
{
    int fd;
    struct stat st_buf;
    
    fd = open (argv[1], O_RDONLY);
    fstat (fd, &st_buf);
    st_buf.st_ino>>32;
    printf ("%s; dev: %i; ino: %i\n", argv[1],st_buf.st_dev, 
            st_buf.st_ino);
    
    return EXIT_SUCCESS;
}


При компиляции (g++-3.3 or g++-3.4) видим варнинг
Цитата

./check_files.cpp: In function `int main(int, char**)':
./check_files.cpp:14: warning: right shift count >= width of type


Однако :
Цитата

$ ./a.out ./a.out
./a.out; dev: 769; ino: 0


И что мы видим ? После бития башкой об стенку и сидения на реакторе ?
Код

struct stat
  {
    __dev_t st_dev;            /* Device.  */
    unsigned short int __pad1;
#ifndef __USE_FILE_OFFSET64
    __ino_t st_ino;            /* File serial number.    */
#else
    __ino_t __st_ino;            /* 32bit file serial number.    */
#endif
    ...

#ifndef __USE_FILE_OFFSET64
    unsigned long int __unused4;
    unsigned long int __unused5;
#else
    __ino64_t st_ino;            /* File serial number.    */
#endif
  };

Внемение вопрос определен ли __USE_FILE_OFFSET64 по-дефолту и сколько бит в st_ino ?
И знаете что я об этом думаю ?

<censored>

Вот такие пироги.



Это сообщение отредактировал(а) GrayCardinal - 20.11.2006, 14:53


--------------------
PM MAIL WWW   Вверх
MAKCim
Дата 20.11.2006, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата

и сколько бит в st_ino ?

Код

sizeof(st_buf.st_ino) * 8;

 smile 

Это сообщение отредактировал(а) MAKCim - 20.11.2006, 17:43


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
GrayCardinal
Дата 20.11.2006, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



MAKCim
Ага, я так и подумал   smile 


--------------------
PM MAIL WWW   Вверх
GrayCardinal
Дата 20.11.2006, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



printf ("%i\n", sizeof (st_buf.st_ino) * 8);
выдает 32
 smile 

все, пошел вешаццо ...


--------------------
PM MAIL WWW   Вверх
GrayCardinal
Дата 20.11.2006, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



ЗЫ
Меня немного попустило когда strace выдал fstat64 вместо fstat  smile

Добавлено @ 19:07 
Однако хочется заметить что в моих "архистабильных" манах (Debian 3.1) нет НИКАКОГО упомининия fstat64 smile 


--------------------
PM MAIL WWW   Вверх
MAKCim
Дата 20.11.2006, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата

Однако хочется заметить что в моих "архистабильных" манах (Debian 3.1) нет НИКАКОГО упомининия fstat64

видно это дело не для прямого использования
(у меня тоже не оказалось)
Цитата

все, пошел вешаццо ... 

оно того не стоит   smile 
видно дело в том, что при сдвиге на 32 старший бит 3-го байта выходит за диапозон, т. е теряется (что-то типа переполнения в сторону младших разрядов), непонятно только к чему warning

ps. при сдвиге на 31 все OK


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bilbobagginz
Дата 20.11.2006, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



а потом объясняй заказчику-овцеводу что программа записи баранов до 32 бит стоит 
дешевле чем больше 32 бит

smile 


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
GrayCardinal
Дата 20.11.2006, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



bilbobagginz
 smile 


--------------------
PM MAIL WWW   Вверх
SynthEtic
Дата 21.11.2006, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 19.11.2006
Где: Украина

Репутация: нет
Всего: нет



fstat - обертка целой кучи функций, также как, например, mount - типа для тех же целей, что перегрузка функций в С++

strace показал конкретную функцию вызываемую из fstat, а именно - fstat64. И использовать fstat64 в коде в таком случае ессесна нельзя, т.к. полностью теряется портабельность (если такой код вообще скомпилируется (хотя, чего бы ему не скомпилиться???))

длина st_ino - 32 бита, т.к. тип его - ino_t, который определен как unsigned int

варнинг g++ полностью понятен, ты сделал сдвиг на всю длину, т.е. если у тебя была переменная unsigned int i = 0xffffffff и ты сделаешь сдвиг на 32 разряда в любую сторону, то получишь вновь те же 0xffffffff, что вообщем-то не является еррором, но ворнингом - точно! потому что в результате сдвига ты потерял ВСЕ значащие разряды и теперь тебе с логической точки зрения просто нечего анализировать - отсюда ворнинг
так что засады нет smile 
PM MAIL   Вверх
GrayCardinal
Дата 21.11.2006, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



SynthEtic
Цитата

длина st_ino - 32 бита,

Да ну ?! Позвольте с вами не согласиться !
st_ino ну никак не может быть равен нулю. Ну вообще никак.
а если 
printf ("%i %i", st_buf.st_ino)
Первый будет ноль, а второй как раз номер INODE.
(я для чего привел софтину и резУльтат ?)
И не знаю я как это получается, но если бы он был 32 бита, такого бы небыло, а ?

Добавлено @ 21:25 
У меня там реально ноль был, чесслово. 
под 2.6.8-amd64 ядром  smile

Добавлено @ 21:26 
Ща еще потестю, может правда глюк и этот люк в потолке не с простоа.....  smile 

Это сообщение отредактировал(а) GrayCardinal - 21.11.2006, 21:17


--------------------
PM MAIL WWW   Вверх
GrayCardinal
Дата 21.11.2006, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



SynthEtic
А засада таки была (хотя st_ino и правда 4 байта  smile) .
printf ("%s; dev: %i; ino: %i\n", argv[1], st_buf.st_dev, 
            st_buf.st_ino);
ino = 0 получалось вот здесь.
Короче такая шняга из-за st_dev который 64 бита (что опять таки нигде не написано)  smile 




Это сообщение отредактировал(а) GrayCardinal - 21.11.2006, 21:42


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1489 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.