linux中的文件有关的结构信息

linux管理文件是通过stat这个结构体来标示的,每一个文件都对应一个stat结构体:
  1. struct stat {
  2.               dev_t st_dev; /* ID of device containing file */
  3.               ino_t st_ino; /* inode number */
  4.               mode_t st_mode; /* protection */
  5.               nlink_t st_nlink; /* number of hard links */
  6.               uid_t st_uid; /* user ID of owner */
  7.               gid_t st_gid; /* group ID of owner */
  8.               dev_t st_rdev; /* device ID (if special file) */
  9.               off_t st_size; /* total size, in bytes */
  10.               blksize_t st_blksize; /* blocksize for filesystem I/O */
  11.               blkcnt_t st_blocks; /* number of blocks allocated */
  12.               time_t st_atime; /* time of last access */
  13.               time_t st_mtime; /* time of last modification */
  14.               time_t st_ctime; /* time of last status change */
  15.           };

现在大致介绍一下每一个成员的含义:

st_mode :文件的类型和模式,linux系统就是通过这个参数来确定这个文件的类型,比如是普通文件还是目录文件还是……。同时也是通过这个参数来确定这个文件的执行权限问题的。谈到它的取值就非常多了。大致介绍一下:

S_IFMT :文件类型位元组合的位的屏蔽位,就是如果我们先让st_mode & S_IFMT 得到的值就是对应文件的类型,屏蔽掉了关于文件读取执行权限有关的位。

S_IFSOCK :是不是套接字,这种文件类型用于进程间的网络通信。套接字也可以用在一台宿主机上的进程之间的非网络通信。

S_IFLNK :符号链接文件。这种文件指向另一个文件。

S_IFREG :普通文件。这也是在linux系统中最常用的文件类型。

S_IFBLK :块设备文件。这种文件提供对设备(如:磁盘)带缓冲的访问,而且每一次访问都以固定的长度为单位进行。

S_IFDIR :目录文件。

S_IFCHR :字符设备文件。这种文件类型提供对设备不带缓冲的访问,每一个访问的长度可变。

……

这些可以通过:

  1. S_ISREG(m) S_ISDIR(m) S_ISCHR(m) S_ISBLK(m) S_ISFIFO(m) S_ISLNK(m) S_ISSOCK(m)

来判定。

st_ino :对应的I节点号。因为linux为了更快的能够检索出文件而不需要将文件的具体存储信息从磁盘上读取出来而采用I节点来存储一些跟检索有关的信息,当然I节点并不是只是为了检索,也为了实现文件的共享。一旦文件被检索到,在RAM中就会保留一份跟I节点一样的信息结构体,用来实现对文件的访问和信息的访问。

st_dev :储存文件的设备号。用来标示哪一个设备存储了该文件。

st_rdev :特殊文件的设备号。

st_nlink :文件被链接的个数,对文件的释放时需要用。

st_uid :文件所有者的用户ID号。

st_gid :文件所有者所在组的ID号

st_size :以字节为单位给出了文件的长度,如果是普通文件,那么这个长度就是文件的真实长度。如果是符号链接,那么这个长度是它所包含的路径的长度,不包含尾端的空字符。

st_atime :文件的最后访问时间。例如read函数就会更改文件的最终访问时间,而mmap()函数可能不会更改文件的最后的访问时间。

st_mtime :文件的最终修改时间。

st_ctime :改变或者写I节点信息会更改这个时间。

为了获得这些信息,我们可以通过借助某一些函数

  1. int stat(const char *path, struct stat *buf);
  2.        int fstat(int filedes, struct stat *buf);
  3.        int lstat(const char *path, struct stat *buf);

stat函数根据指定的文件路径找到文件,并根据找到的文件填充stat结构体。

fstat函数根据给定的打开的文件的标示符,来填充stat结构体

lstat函数与stat函数大致相同,唯一区别:lstat函数在遇到path是一个符号链接的时候,会用该符号链接相关的信息填充stat结构体,而不是用该连接符号所指向的文件的信息来填充这个stat结构体。


你可能感兴趣的:(linux,linux,struct,path,存储,磁盘,file)