当前位置: 技术问答>linux和unix
一个有关readdir函数的问题~~~
来源: 互联网 发布时间:2016-09-09
本文导语: 一个有关readdir函数的问题~~~ 网上查到,readdir的功能是读取下一个innode;那是不是意味着: 假如我用readdir读取目录的时候,其innode的值是递增||递减的? 但我发现实际结果并不是这样,innode的值并不是递增||...
一个有关readdir函数的问题~~~
网上查到,readdir的功能是读取下一个innode;那是不是意味着:
假如我用readdir读取目录的时候,其innode的值是递增||递减的?
但我发现实际结果并不是这样,innode的值并不是递增||递减的
代码:
遍历某个目录的结果:
可以看到,innode的值似乎没什么规律~~~~这是怎么回事?
网上查到,readdir的功能是读取下一个innode;那是不是意味着:
假如我用readdir读取目录的时候,其innode的值是递增||递减的?
但我发现实际结果并不是这样,innode的值并不是递增||递减的
代码:
void printdir(char* dir,int depth)
{
DIR* str=opendir(dir);
struct stat statbuf;
struct dirent* entry;
if(str==NULL){
printf("the direction is not valid");
return;
}
chdir(dir);
while((entry=readdir(str))!=NULL){
lstat(entry->d_name,&statbuf);
if(S_ISDIR(statbuf.st_mode))
{
if(strcmp(".",entry->d_name)==0||strcmp("..",entry->d_name)==0)
continue;
printf("%*s%s%s%d/n",depth," ",entry->d_name," ",entry->d_ino);
printdir(entry->d_name,depth+1);
}
else{
printf("%*s%s%s%dn",depth," ",entry->d_name," ",entry->d_ino);
}
}
chdir("..");
closedir(str);
}
遍历某个目录的结果:
share 262381/
servicetypes 262443/
locale 271272/
applnk 262641/
services 262640/
config 262382/
可以看到,innode的值似乎没什么规律~~~~这是怎么回事?
|
是按照保存在硬盘上的位置来排序的,也就是entry->d_off
struct dirent {
ino_t d_ino; /* inode number */
off_t d_off; /* offset to the next dirent */ // 就是这个 unsigned short d_reclen; /* length of this record */
unsigned char d_type; /* type of file */
char d_name[256]; /* filename */
};
struct dirent {
ino_t d_ino; /* inode number */
off_t d_off; /* offset to the next dirent */ // 就是这个 unsigned short d_reclen; /* length of this record */
unsigned char d_type; /* type of file */
char d_name[256]; /* filename */
};
|
见内核 fs/inode.c 代码
inode值的分配比较无序,几乎没有规律
ino_t iunique(struct super_block *sb, ino_t max_reserved)
{
/*
* On a 32bit, non LFS stat() call, glibc will generate an EOVERFLOW
* error if st_ino won't fit in target struct field. Use 32bit counter
* here to attempt to avoid that.
*/
static unsigned int counter;
struct inode *inode;
struct hlist_head *head;
ino_t res;
spin_lock(&inode_lock);
do {
if (counter > I_HASHBITS);
return tmp & I_HASHMASK;
}
inode值的分配比较无序,几乎没有规律
|
新建文件时,分配inode是无序的,readdir读取时,顺序依赖于具体文件系统类型,
readdir内部调用了vfs_readdir,最终实现这个功能的是ext3_readdir(文件系统名_readdir),
inode不论递增递减,都不能保证
readdir内部调用了vfs_readdir,最终实现这个功能的是ext3_readdir(文件系统名_readdir),
inode不论递增递减,都不能保证