помогите разобраться с inode и stat и dirent
Модератор: Модераторы разделов
помогите разобраться с inode и stat и dirent
помогите, пожалуйста, разобраться:
я не могу понять почему для reiserfs информация про inode полученная из struct dirent поля d_ino и c помощью lstat в поле st_ino для каталогов /. и /.. отличается:
stat выдает одинаковые(по-моему так должно быть всегда?) inode=2 для /. и /..
а в d_ino для /. inode=2, а для /.. inode=1
(reiserfs смонтирована на /)
причем для директорий вида /../.. то же самое;
а на ext3 смонтированной в /home все работает
я не могу понять почему для reiserfs информация про inode полученная из struct dirent поля d_ino и c помощью lstat в поле st_ino для каталогов /. и /.. отличается:
stat выдает одинаковые(по-моему так должно быть всегда?) inode=2 для /. и /..
а в d_ino для /. inode=2, а для /.. inode=1
(reiserfs смонтирована на /)
причем для директорий вида /../.. то же самое;
а на ext3 смонтированной в /home все работает
Re: помогите разобраться с inode и stat и dirent
Talk is cheap show me the code.
Сорс в студию с аргументами запуска если таковые имеются.
Сорс в студию с аргументами запуска если таковые имеются.
В каждом из нас спит гений... и с каждым днем все крепче...
Re: помогите разобраться с inode и stat и dirent
Вот:
#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
#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
Re: помогите разобраться с inode и stat и dirent
АУУУУУУУУУУУ!!!
кто-нибудь откликнетесь!!!
кто-нибудь откликнетесь!!!
Re: помогите разобраться с inode и stat и dirent
не кипятись ща разберемся.
flook добавил в 12.09.2005 13:55
Дело в том, что за директорией, к которой что-то примонтировано реаьно стоит 2 inode. Одна - то куджа примонтировали, 2ая - корень того, что примонтировали. Так вот readdir дает inode того куда, а lstat - того, что.
flook добавил в 12.09.2005 13:55
Дело в том, что за директорией, к которой что-то примонтировано реаьно стоит 2 inode. Одна - то куджа примонтировали, 2ая - корень того, что примонтировали. Так вот readdir дает inode того куда, а lstat - того, что.
В каждом из нас спит гений... и с каждым днем все крепче...
Re: помогите разобраться с inode и stat и dirent
я в Linux только новичок, поэтому можно поподробнее.
и еще: а разве inode=1 используют? ведь ,по-моему, раньше его использовали для поврежденных секторов, а теперь вообще не используют(я имел ввиду для файла
содержащего поврежденные сектора)
и еще: а разве inode=1 используют? ведь ,по-моему, раньше его использовали для поврежденных секторов, а теперь вообще не используют(я имел ввиду для файла
содержащего поврежденные сектора)
Re: помогите разобраться с inode и stat и dirent
(JK_Darien @ Понедельник, 12 Сентября 2005, 13:00) писал(а):я в Linux только новичок, поэтому можно поподробнее.
Что именно?
(JK_Darien @ Понедельник, 12 Сентября 2005, 13:00) писал(а):и еще: а разве inode=1 используют? ведь ,по-моему, раньше его использовали для поврежденных секторов, а теперь вообще не используют(я имел ввиду для файла
содержащего поврежденные сектора)
Как видишь используют.
В каждом из нас спит гений... и с каждым днем все крепче...
Re: помогите разобраться с inode и stat и dirent
почему тогда inode ../. тоже 2, а не 1?
и потом:
когда я запускаю из /home то readdir для . и .. дает одинаковый inode=2,
но если для корневого каталога для /. readdir показывает ino=2, а для /.. ino=1
то ведь получается что для .. показан ino того куда примонтировано, а для . того что примонтировано, значит для /home должно быть /home/.. ino=3 и /home/. ino=2
а получается не так?
и потом:
когда я запускаю из /home то readdir для . и .. дает одинаковый inode=2,
но если для корневого каталога для /. readdir показывает ino=2, а для /.. ino=1
то ведь получается что для .. показан ino того куда примонтировано, а для . того что примонтировано, значит для /home должно быть /home/.. ino=3 и /home/. ino=2
а получается не так?
Re: помогите разобраться с inode и stat и dirent
Ты когда пускаешь прогу для /home, то он и readdir для другой inode вызывает. А что касается / то это "фича" райзера - для ext3 все пучком.
В каждом из нас спит гений... и с каждым днем все крепче...
Re: помогите разобраться с inode и stat и dirent
а где-нибудь про это почитать побольше можно?
не знаешь каких-нибудь ссылок?
не знаешь каких-нибудь ссылок?
Re: помогите разобраться с inode и stat и dirent
Ссылок не знаю. Такие тонкости врядли где-то описаны - надо в ядро глядеть.
В каждом из нас спит гений... и с каждым днем все крепче...
Re: помогите разобраться с inode и stat и dirent
Ладно БАЛЬШОЕ спасибо!
Re: помогите разобраться с inode и stat и dirent
Кстати, в умной книжке я вычитал, что из struct dirent можно использовать только d_name.
Остальные поля "недокументированы".
Например, мне пришлось как-то переделывать логику программы, когда выяснилось, что на ext3 тип файла определяется, а на xfs - нет. Так что лучше юзать lstat.
Остальные поля "недокументированы".
Например, мне пришлось как-то переделывать логику программы, когда выяснилось, что на ext3 тип файла определяется, а на xfs - нет. Так что лучше юзать lstat.
ArchLinux / IceWM
Re: помогите разобраться с inode и stat и dirent
да я тоже пробовал использовать 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 описание правильное
точнее на 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 описание правильное
Re: помогите разобраться с inode и stat и dirent
А вы юзайте readdir как syscall (man 2 readdir) а не как glibc вызов (man 3 readdir) Получите массу удовольствия :thumbsup:
В каждом из нас спит гений... и с каждым днем все крепче...
Re: помогите разобраться с inode и stat и dirent
как раз собирался попробовать
Re: помогите разобраться с inode и stat и dirent
(flook @ Понедельник, 12 Сентября 2005, 13:52) писал(а):А вы юзайте readdir как syscall (man 2 readdir) а не как glibc вызов (man 3 readdir) Получите массу удовольствия :thumbsup:
Вот только слегка напрягает
This page documents the bare kernel system call interface, which can change, and which is superseded by getdents(2).
То есть, насколько я понял, есть вероятность, что может измениться и для прикладного применения не рекомендуется?..
ArchLinux / IceWM
Re: помогите разобраться с inode и stat и dirent
(madskull @ Понедельник, 12 Сентября 2005, 14:31) писал(а):(flook @ Понедельник, 12 Сентября 2005, 13:52) писал(а):А вы юзайте readdir как syscall (man 2 readdir) а не как glibc вызов (man 3 readdir) Получите массу удовольствия :thumbsup:
Вот только слегка напрягает
This page documents the bare kernel system call interface, which can change, and which is superseded by getdents(2).
То есть, насколько я понял, есть вероятность, что может измениться и для прикладного применения не рекомендуется?..
Это да, но пока еще не меняется и интересен подход! Немного заинтригую - возвращаются структуры переменного размера B)
В каждом из нас спит гений... и с каждым днем все крепче...
Re: помогите разобраться с inode и stat и dirent
для flook:
кстати я попробовал использовать getdents() ... но затем
Действительно, здорово!
кстати, если кому-то интересно, то я написал для себя комментарий:
вот
если кто-то прочтет, то может напишите замечания( может слишком подробно? или не нужны примеры?)
или может я что забыл написать или написал неправильно?
чуть не забыл:
для понятности, можно еще добавить:
те при монтировании в файле каталога inode той папки, к которой монтируется ф.с., не изменяется, поэтому когда мы находимся на смонтированной ф.с. readdir() выдает inode корневой папки смонтированной ф.с.(в примере, это inode 2 для /home, когда пускаем прогу для /home), а когда находимся в каталоге, где находится папка КУДА примонтировали, то readdir() дает первоначальный(такой же как до монтирования) inode для папки куда примонтировали(в примере это 3 для /home, когда пускаем прогу для /); stat() выдает inode корневого каталога в любом случае;
А вы юзайте readdir как syscall (man 2 readdir) а не как glibc вызов (man 3 readdir) smile.gif Получите массу удовольствия thumbsup.gif rolleyes.gif
кстати я попробовал использовать getdents() ... но затем
Действительно, здорово!
кстати, если кому-то интересно, то я написал для себя комментарий:
вот
если кто-то прочтет, то может напишите замечания( может слишком подробно? или не нужны примеры?)
или может я что забыл написать или написал неправильно?
чуть не забыл:
Дело в том, что за директорией, к которой что-то примонтировано реаьно стоит 2 inode. Одна - то куджа примонтировали, 2ая - корень того, что примонтировали. Так вот readdir дает inode того куда, а lstat - того, что.
для понятности, можно еще добавить:
те при монтировании в файле каталога inode той папки, к которой монтируется ф.с., не изменяется, поэтому когда мы находимся на смонтированной ф.с. readdir() выдает inode корневой папки смонтированной ф.с.(в примере, это inode 2 для /home, когда пускаем прогу для /home), а когда находимся в каталоге, где находится папка КУДА примонтировали, то readdir() дает первоначальный(такой же как до монтирования) inode для папки куда примонтировали(в примере это 3 для /home, когда пускаем прогу для /); stat() выдает inode корневого каталога в любом случае;
Re: помогите разобраться с inode и stat и dirent
madskull писал(а): ↑12.09.2005 14:36Кстати, в умной книжке я вычитал, что из struct dirent можно использовать только d_name.
Остальные поля "недокументированы".
Например, мне пришлось как-то переделывать логику программы, когда выяснилось, что на ext3 тип файла определяется, а на xfs - нет. Так что лучше юзать lstat.
Интересно, а кто-нибудь знает, какие значения может принимать d_type и каким типам файлов они соответствуют? Конечно, метод тыка - великая вещь, но все же?