DEV Community

Ariston
Ariston

Posted on

Unix高级环境编程之文件和目录

引言

从stat函数开始,诸葛说明stat结构中的每一个成员了解文件的所有属性。将说明修改这些属性的各个函数,更详细地说明UNIX文件系统的结构以及符号链接

函数stat、fstat、fstatat和lstat

Image description

给出pathname,stat函数将返回与此文件有关的信息结构。fstat获得fd上打开文件的有关信息,lstat类似于stat,但是当命名的文件是符号链接时,lstat返回符号链接的有关信息而不是该符号链接引用的文件的信息。

fstatat允许通过文件描述符和相对路径名指定要获取信息的文件。
dirfd:一个打开的目录的文件描述符,相对路径名pathname的起始点。如果pathname是绝对路径,则dirfd被忽略。
pathname:要获取状态信息的文件的路径名。如果pathname是绝对路径,dirfd通常被设置为AT_FDCWD。
statbuf:指向stat结构的指针,该结构用于存储文件的状态信息。
flags:可以是零或者以下一个或多个标志的组合,影响函数的行为:
AT_SYMLINK_NOFOLLOW:不要解引用符号链接,而是返回关于链接本身的信息。
AT_NO_AUTOMOUNT:阻止自动挂载触发。
AT_EMPTY_PATH:允许pathname是空字符串,这种情况下会返回dirfd所指向对象的状态。

返回值:
成功时,返回0,statbuf结构会被填充。
失败时,返回-1,并设置errno以指示错误原因,如EACCES、EBADF、EFAULT、ENOENT等。

stat结构:

struct stat {
    dev_t     st_dev;     // 文件的设备ID
    ino_t     st_ino;     // 节点
    mode_t    st_mode;    // 文件的类型和存储的权限
    nlink_t   st_nlink;   // 硬链接的数量
    uid_t     st_uid;     // 所有者的用户ID
    gid_t     st_gid;     // 所有者的组ID
    dev_t     st_rdev;    // 设备ID(如果是特殊文件)
    off_t     st_size;    // 总大小,以字节为单位
    blksize_t st_blksize; // 文件系统的I/O块大小
    blkcnt_t  st_blocks;  // 分配的512B块的数量

    // 访问和修改时间戳
    struct timespec st_atim;  // 最后访问时间
    struct timespec st_mtim;  // 最后修改时间
    struct timespec st_ctim;  // 最后状态改变时间

    // ...可能还有其他的字段...
};

time_t tv_sec;
long tv_nsec;//timespec至少包含的两个字段
Enter fullscreen mode Exit fullscreen mode

使用stat函数最多的地方可能就是ls -l。获得文件所有信息。

4.3 文件类型

1.普通文件

包含了某种形式的数据。

2.目录文件

包含了其他文件的名字以及指向与这些文件有关信息的指针。对一个目录文件具有读权限的任意进程都可以读该目录的内容。进程必须要用本章介绍的函数才能更改目录。

3.块特殊文件

提供对设备带缓冲的访问,每次以固定长度为单位进行

4.字符特殊文件

提供对设备不带缓冲的访问,每次访问长度可变。系统中所有设备要么是字符特殊文件,要么是块特殊文件。

5.FIFO

用于进程间通信,有时被称为命名管道(named pipe)

6.套接字

用于进程间网络通信,也可以用于进程间非网络通信

7.符号链接

这种类型的文件指向另一个文件,17节会更多描述符号链接

Image description

Top comments (0)