Unix高级环境编程(APUE)-----文件与目录

1、引言

        上一章说明了执行IO操作的基本函数,基本讨论的是围绕普通文件的IO进行--打开一个文件或读写一个文件,这一章将观察文件系统的其他特征和文件的性质。

2、stat、fatat和lstat函数

        本章讨论的是下面三个函数以及他们返回的信息:

 #include <sys/types.h>
 #include <sys/stat.h>
 #include <unistd.h>

int stat(const char *pathname, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *pathname, struct stat *buf);

        给定一个pathname,stat函数返回一个与此命名文件有关的信息结构。fatat函数获得已在描述符fd上打开的文件有关信息,lstat函数类似于stat,但当命名文件是一个符号连接时,lstat返回该符号连接的有关信息。第二个参数是个指针,指向一个结构,以下为stat字段含义:

struct stat {
    dev_t     st_dev;     /* ID of device containing file */
    ino_t     st_ino;     /* inode 号 */
    mode_t    st_mode;    /* 权限和文件类型,位图,权限位9位,类型3位,u+s 1位,g+s 1位,粘滞位(T位)1位。
                      位图是用一位或几位数据表示某种状态。许多要解决看似不可能的问题的面试题往往需要从位图着手。*/
    nlink_t   st_nlink;   /* 硬链接数量 */
    uid_t     st_uid;     /* 文件属主 ID */
    gid_t     st_gid;     /* 文件属组 ID */
    dev_t     st_rdev;    /* 设备号,只有设备文件才有 */
    off_t     st_size;    /* 总大小字节数,编译时需要指定宏 -D_FILE_OFFSIZE_BITES=64,否则读取大文件可能导致溢出 */
    blksize_t st_blksize; /* 文件系统块大小 */
    blkcnt_t  st_blocks;  /* 每个 block 占用 512B,则整个文件占用的 block 数量。这个值是文件真正意义上所占用的磁盘空间 */
    // 下面三个成员都是大整数,实际使用时需要先转换
    time_t    st_atime;   /* 文件最后访问时间戳 */
    time_t    st_mtime;   /* 文件最后修改时间戳 */
    time_t    st_ctime;   /* 文件亚数据最后修改时间戳 */
}

        使用stat函数最多的可能就是ls -l命令。显示一个文件的所有信息。

3、文件类型

        之前学linux时接触过文件类型了,这里就简单介绍即可。除了普通文件和目录,还有一些文件类型:

        (1)普通文件,常见的文件类型,这种文件包含某种形式的数据,不管其是文本数据还是二进制数据。

        (2)目录文件,这种文件包含其他文件的名字以及指向这些文件有关信息的指针。

        (3)字符特殊文件,用于系统中某种类型的设备。

        (4)块特殊文件,用于磁盘设备。

        (5)FIFO,用于进程间通信,也叫管道。

        (6)套接口,用于进程间网络通信。

        (7)符号链接,这种文件指向另一个文件。

系统提供了一些宏操作来判断一个文件具体类型:使用时只需要将stat结构里的mode传进去即可,方便在if语句中使用。

S_ISREG(m)        is it a regular file?                                   是否为普通文件

S_ISDIR(m)         directory?                                             是否为目录

S_ISCHR(m)        character device?                                       是否为字符设备文件

S_ISBLK(m)        block device?    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值