(转载)Linux下DIR,dirent,stat等结构体详解

摘要:
int __ entry_数据;int __ entry_ptr;从readdir函数读取的文件名存储在结构目录的d中。在name成员中,struct stat{mode_t st_mode;//索引节点编号dev_t st_dev;

摘自:http://www.liweifan.com/2012/05/13/linux-system-function-files-operation/

最近在看Linux下文件操作相关章节,遇到了这么几个结构体,被搞的晕乎乎的,今日有空,仔细研究了一下,受益匪浅。

首先说说DIR这一结构体,以下为DIR结构体的定义:

  1. struct __dirstream
  2.    {
  3.     void *__fd;
  4.     char *__data;
  5.     int __entry_data;
  6.     char *__ptr;
  7.     int __entry_ptr;
  8.     size_t __allocation;
  9.     size_t __size;
  10.     __libc_lock_define (, __lock)
  11.    };
  12. typedef struct __dirstream DIR;

DIR结构体类似于FILE,是一个内部结构,以下几个函数用这个内部结构保存当前正在被读取的目录的有关信息(摘自《UNIX环境高级编程(第二版)》)。函数 DIR *opendir(const char *pathname),即打开文件目录,返回的就是指向DIR结构体的指针,而该指针由以下几个函数使用:

  1. struct dirent *readdir(DIR *dp);
  2. void rewinddir(DIR *dp);
  3. int closedir(DIR *dp);
  4. long telldir(DIR *dp);
  5. void seekdir(DIR *dp,long loc);

关于DIR结构,我们知道这么多就可以了,没必要去再去研究他的结构成员。

接着是dirent结构体,首先我们要弄清楚目录文件(directory file)的概念:这种文件包含了其他文件的名字以及指向与这些文件有关的信息的指针(摘自《UNIX环境高级编程(第二版)》)。从定义能够看出,dirent不仅仅指向目录,还指向目录中的具体文件,readdir函数同样也读取目录下的文件,这就是证据。以下为dirent结构体的定义:

  1. struct dirent
  2. {
  3.   long d_ino; /* inode number 索引节点号 */
  4.     off_t d_off; /* offset to this dirent 在目录文件中的偏移 */
  5.     unsigned short d_reclen; /* length of this d_name 文件名长 */
  6.     unsigned char d_type; /* the type of d_name 文件类型 */
  7.     char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最长255字符 */
  8. }

从上述定义也能够看出来,dirent结构体存储的关于文件的信息很少,所以dirent同样也是起着一个索引的作用,如果想获得类似ls -l那种效果的文件信息,必须要靠stat函数了。

通过readdir函数读取到的文件名存储在结构体dirent的d_name成员中,而函数

int stat(const char *file_name, struct stat *buf);

的作用就是获取文件名为d_name的文件的详细信息,存储在stat结构体中。以下为stat结构体的定义:

  1. struct stat {
  2.         mode_t     st_mode;       //文件访问权限
  3.         ino_t      st_ino;       //索引节点号
  4.         dev_t      st_dev;        //文件使用的设备号
  5.         dev_t      st_rdev;       //设备文件的设备号
  6.         nlink_t    st_nlink;      //文件的硬连接数
  7.         uid_t      st_uid;        //所有者用户识别号
  8.         gid_t      st_gid;        //组识别号
  9.         off_t      st_size;       //以字节为单位的文件容量
  10.         time_t     st_atime;      //最后一次访问该文件的时间
  11.         time_t     st_mtime;      //最后一次修改该文件的时间
  12.         time_t     st_ctime;      //最后一次改变该文件状态的时间
  13.         blksize_t st_blksize;    //包含该文件的磁盘块的大小
  14.         blkcnt_t   st_blocks;     //该文件所占的磁盘块
  15.       };

这个记录的信息就很详细了吧,呵呵。

最后,总结一下,想要获取某目录下(比如a目下)b文件的详细信息,我们应该怎样做?

首先,我们使用opendir函数打开目录a,返回指向目录a的DIR结构体c。

接着,我们调用readdir( c)函数读取目录a下所有文件(包括目录),返回指向目录a下所有文件的dirent结构体d。

然后,我们遍历d,调用stat(d->name,stat *e)来获取每个文件的详细信息,存储在stat结构体e中。

总体就是这样一种逐步细化的过程,在这一过程中,三种结构体扮演着不同的角色。

免责声明:文章转载自《(转载)Linux下DIR,dirent,stat等结构体详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Kali下的内网劫持(一)如何使用PLX提供的官方驱动和SDK发布自己的产品?下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

在ThreadPool.QueueUserWorkIte 的回调函数中发生未处理异常导致了应用程序重启

用户登陆Session丢失,可能是因为应用程序发生错误而导致重启。这次遇到这情况是由于使用了ThreadPool.QueueUserWorkItem, 其中回调函数执行时发生未处理的异常,导致了ASP.NET 应用程序意外退出。参考:在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出(http://sup...

简单应用复旦FNLP自然语言处理工具(一)

FNLP是一个基于机器学习的中文自然语言文本处理的开发工具包,FNLP主要是为中文自然语言处理而开发的工具包,也包含为实现这些任务的机器学习算法和数据集。                                                      ----------百度百科 信息检索 文本分类 新闻聚类 中文处理: 中文分词 词性标注...

lucene教程简介

1 lucene简介 1.1 什么是lucene     Lucene是一个全文搜索框架,而不是应用产品。因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品。 2 lucene的工作方式     lucene提供的服务实际包含两部分:一入一出。所谓入是写入,即将你提供的源(本质...

Myeclipse安装svn插件

Myeclipse安装svn插件 演示版本 myeclipse——myeclipse8.6 svn——subeclipse-site-1.6.5.zip(对应Myeclipse版本,要有对应的svn插件版本) 方法一: 1.解压svn插件到Myeclipse安装目录下(新建一个目录myplugins,并删除所有的配置文件(xml文件) 2.在Myeclip...

阿里云oss对象存储在vue中的使用

阿里云对象存储OSS(Object Storage Service)是阿里云提供的海量、安全、低成本、高持久的云存储服务。其数据设计持久性不低于99.9999999999%(12个9),服务可用性(或业务连续性)不低于99.995%。 OSS具有与平台无关的RESTful API接口,可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。 项目中如果...

接口-配置文件

实现功能:通过更改配置文件实现不同的功能 1,创建以下内容  2,ICar接口代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 接口配置文件 {...