помогите разобраться с inode и stat и dirent

Взгляд изнутри

Модератор: Модераторы разделов

Ответить
JK_Darien
Сообщения: 20

помогите разобраться с inode и stat и dirent

Сообщение JK_Darien »

помогите, пожалуйста, разобраться:
я не могу понять почему для reiserfs информация про inode полученная из struct dirent поля d_ino и c помощью lstat в поле st_ino для каталогов /. и /.. отличается:
stat выдает одинаковые(по-моему так должно быть всегда?) inode=2 для /. и /..
а в d_ino для /. inode=2, а для /.. inode=1
(reiserfs смонтирована на /)
причем для директорий вида /../.. то же самое;
а на ext3 смонтированной в /home все работает
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: помогите разобраться с inode и stat и dirent

Сообщение flook »

Talk is cheap show me the code.
Сорс в студию с аргументами запуска если таковые имеются.
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
JK_Darien
Сообщения: 20

Re: помогите разобраться с inode и stat и dirent

Сообщение JK_Darien »

Вот:
#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<dirent.h>
#define ERR { fprintf(stderr,"e.c:error %s\n",strerror(errno));\
exit(-1); }
int main()
{
DIR*dp;
struct stat sbuf;
struct dirent *ent;
char path[50]="/";
int i;
if((dp=opendir("/"))==NULL)
ERR
errno=0;
while((ent=readdir(dp))!=NULL){
printf("%s inode=%ld ",ent->d_name,ent->d_ino);
for(i=0);ent->d_name[i]!='\0';i++)
path[1+i]=ent->d_name[i];
path[1+i]='\0';
if(lstat(path,&sbuf)<0)
ERR
printf(" stat: inode=%ld\n",sbuf.st_ino);
}
if(errno!=0)
ERR
if(closedir(dp)<0)
ERR
return 1;
}

далее:
#gсc ./e.c -o ./e -Wall
#e
. inode=2 stat: inode=2
.. inode=1 stat: inode=2 <-!!!!
bin inode=43 stat: inode=43
dev inode=25 stat: inode=25
etc inode=44 stat: inode=44
lib inode=47 stat: inode=47
mnt inode=17 stat: inode=17
opt inode=82836 stat: inode=82836
tmp inode=51 stat: inode=51
sys inode=52 stat: inode=52
var inode=4 stat: inode=4
usr inode=71 stat: inode=71
boot inode=141 stat: inode=141
home inode=3 stat: inode=2 <-!!!!!
proc inode=142 stat: inode=1 <-!!!!
sbin inode=143 stat: inode=143
root inode=144 stat: inode=144
Спасибо сказали:
JK_Darien
Сообщения: 20

Re: помогите разобраться с inode и stat и dirent

Сообщение JK_Darien »

АУУУУУУУУУУУ!!!
кто-нибудь откликнетесь!!!
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: помогите разобраться с inode и stat и dirent

Сообщение flook »

не кипятись :) ща разберемся.

flook добавил в 12.09.2005 13:55

Дело в том, что за директорией, к которой что-то примонтировано реаьно стоит 2 inode. Одна - то куджа примонтировали, 2ая - корень того, что примонтировали. Так вот readdir дает inode того куда, а lstat - того, что.
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
JK_Darien
Сообщения: 20

Re: помогите разобраться с inode и stat и dirent

Сообщение JK_Darien »

я в Linux только новичок, поэтому можно поподробнее.
и еще: а разве inode=1 используют? ведь ,по-моему, раньше его использовали для поврежденных секторов, а теперь вообще не используют(я имел ввиду для файла
содержащего поврежденные сектора)
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: помогите разобраться с inode и stat и dirent

Сообщение flook »

(JK_Darien @ Понедельник, 12 Сентября 2005, 13:00) писал(а):я в Linux только новичок, поэтому можно поподробнее.

Что именно?

(JK_Darien @ Понедельник, 12 Сентября 2005, 13:00) писал(а):и еще: а разве inode=1 используют? ведь ,по-моему, раньше его использовали для поврежденных секторов, а теперь вообще не используют(я имел ввиду для файла
содержащего поврежденные сектора)

Как видишь используют.
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
JK_Darien
Сообщения: 20

Re: помогите разобраться с inode и stat и dirent

Сообщение JK_Darien »

почему тогда inode ../. тоже 2, а не 1?
и потом:
когда я запускаю из /home то readdir для . и .. дает одинаковый inode=2,
но если для корневого каталога для /. readdir показывает ino=2, а для /.. ino=1
то ведь получается что для .. показан ino того куда примонтировано, а для . того что примонтировано, значит для /home должно быть /home/.. ino=3 и /home/. ino=2
а получается не так?
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: помогите разобраться с inode и stat и dirent

Сообщение flook »

Ты когда пускаешь прогу для /home, то он и readdir для другой inode вызывает. А что касается / то это "фича" райзера - для ext3 все пучком.
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
JK_Darien
Сообщения: 20

Re: помогите разобраться с inode и stat и dirent

Сообщение JK_Darien »

а где-нибудь про это почитать побольше можно?
не знаешь каких-нибудь ссылок?
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: помогите разобраться с inode и stat и dirent

Сообщение flook »

Ссылок не знаю. Такие тонкости врядли где-то описаны - надо в ядро глядеть.
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
JK_Darien
Сообщения: 20

Re: помогите разобраться с inode и stat и dirent

Сообщение JK_Darien »

Ладно :) БАЛЬШОЕ спасибо! :)
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга
Контактная информация:

Re: помогите разобраться с inode и stat и dirent

Сообщение madskull »

Кстати, в умной книжке я вычитал, что из struct dirent можно использовать только d_name.
Остальные поля "недокументированы".

Например, мне пришлось как-то переделывать логику программы, когда выяснилось, что на ext3 тип файла определяется, а на xfs - нет. Так что лучше юзать lstat.
ArchLinux / IceWM
Спасибо сказали:
JK_Darien
Сообщения: 20

Re: помогите разобраться с inode и stat и dirent

Сообщение JK_Darien »

да я тоже пробовал использовать d_type. работало только на ext3, а на reiser нет
точнее на reiser d_type был всегда в DT_UNKNOWN

добавил в 13:51
и еще я заметил, что в man 2 readdir и man 2 getdents поле d_reclen из struct dirent описано по разному:
из man 2 readdir: unsigned short d_reclen /*length of this d_name*/
из man 2 getdents: unsigned short d_reclen /*length of this dirent*/
и видимо из getdents описание правильное
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: помогите разобраться с inode и stat и dirent

Сообщение flook »

А вы юзайте readdir как syscall (man 2 readdir) а не как glibc вызов (man 3 readdir) :) Получите массу удовольствия :thumbsup: :rolleyes:
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
JK_Darien
Сообщения: 20

Re: помогите разобраться с inode и stat и dirent

Сообщение JK_Darien »

как раз собирался попробовать :)
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга
Контактная информация:

Re: помогите разобраться с inode и stat и dirent

Сообщение madskull »

(flook @ Понедельник, 12 Сентября 2005, 13:52) писал(а):А вы юзайте readdir как syscall (man 2 readdir) а не как glibc вызов (man 3 readdir) :) Получите массу удовольствия  :thumbsup:  :rolleyes:

Вот только слегка напрягает
This page documents the bare  kernel  system  call interface, which can change, and which is superseded by getdents(2).

То есть, насколько я понял, есть вероятность, что может измениться и для прикладного применения не рекомендуется?..
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: помогите разобраться с inode и stat и dirent

Сообщение flook »

(madskull @ Понедельник, 12 Сентября 2005, 14:31) писал(а):
(flook @ Понедельник, 12 Сентября 2005, 13:52) писал(а):А вы юзайте readdir как syscall (man 2 readdir) а не как glibc вызов (man 3 readdir) :) Получите массу удовольствия  :thumbsup:  :rolleyes:

Вот только слегка напрягает
This page documents the bare  kernel  system  call interface, which can change, and which is superseded by getdents(2).

То есть, насколько я понял, есть вероятность, что может измениться и для прикладного применения не рекомендуется?..



Это да, но пока еще не меняется и интересен подход! Немного заинтригую - возвращаются структуры переменного размера B)
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
JK_Darien
Сообщения: 20

Re: помогите разобраться с inode и stat и dirent

Сообщение JK_Darien »

для flook:
А вы юзайте readdir как syscall (man 2 readdir) а не как glibc вызов (man 3 readdir) smile.gif Получите массу удовольствия thumbsup.gif rolleyes.gif

кстати я попробовал использовать getdents() :wacko: :wacko: :wacko: ... но затем :unsure: :rolleyes: :)
Действительно, здорово!
кстати, если кому-то интересно, то я написал для себя комментарий:
вот

если кто-то прочтет, то может напишите замечания( может слишком подробно? или не нужны примеры?)
или может я что забыл написать или написал неправильно?

чуть не забыл:
Дело в том, что за директорией, к которой что-то примонтировано реаьно стоит 2 inode. Одна - то куджа примонтировали, 2ая - корень того, что примонтировали. Так вот readdir дает inode того куда, а lstat - того, что.

для понятности, можно еще добавить:
те при монтировании в файле каталога inode той папки, к которой монтируется ф.с., не изменяется, поэтому когда мы находимся на смонтированной ф.с. readdir() выдает inode корневой папки смонтированной ф.с.(в примере, это inode 2 для /home, когда пускаем прогу для /home), а когда находимся в каталоге, где находится папка КУДА примонтировали, то readdir() дает первоначальный(такой же как до монтирования) inode для папки куда примонтировали(в примере это 3 для /home, когда пускаем прогу для /); stat() выдает inode корневого каталога в любом случае; ;)
Спасибо сказали:
demidrol
Сообщения: 47
ОС: Gentoo Linux

Re: помогите разобраться с inode и stat и dirent

Сообщение demidrol »

madskull писал(а):
12.09.2005 14:36
Кстати, в умной книжке я вычитал, что из struct dirent можно использовать только d_name.
Остальные поля "недокументированы".

Например, мне пришлось как-то переделывать логику программы, когда выяснилось, что на ext3 тип файла определяется, а на xfs - нет. Так что лучше юзать lstat.

Интересно, а кто-нибудь знает, какие значения может принимать d_type и каким типам файлов они соответствуют? Конечно, метод тыка - великая вещь, но все же?
Спасибо сказали:
Ответить