[读书笔记] APUE | 第四章 | 文件和目录

1.查看文件信息函数

  #include <sys/stat.h>
  int stat(const char *path, struct stat *buf);
  int fstat(int fd, struct stat *buf);
  int lstat(const char *path, struct stat *bu

stat函数是通过文件名获取文件信息,fstat通过文件描述符获取文件信息,当文件是一个符号链接时,lstat返回的是符号链接信息,而不是由该符号链接引用文件的信息。
来看stat结构体的信息:

 
 struct stat {
       dev_t     st_dev;     /* ID of device containing file */
       ino_t     st_ino;     /* inode number */
       mode_t    st_mode;    /* protection */
       nlink_t   st_nlink;   /* number of hard links */
       uid_t     st_uid;     /* user ID of owner */
       gid_t     st_gid;     /* group ID of owner */
       dev_t     st_rdev;    /* device ID (if special file) */
       off_t     st_size;    /* total size, in bytes */
       blksize_t st_blksize; /* blocksize for file system I/O */
       blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
       time_t    st_atime;   /* time of last access */
       time_t    st_mtime;   /* time of last modification */
       time_t    st_ctime;   /* time of last status change */
 };

其实stat系列函数的作用等同于"ls -l"命令。

2. 文件类型

unix系统文件包括下面几种:普通文件、目录文件、块特殊文件、字符特殊文件、FIFO、套接字、符号链接。文件信息一般放在stat结构的st_mode成员中。
在这里插入图片描述

3. 文件访问权限

3.1 用户ID和组ID

与一个进程相关的ID有6个或者更多,如下图:
在这里插入图片描述
每个文件都有一个所有者和组所有者,所有者由stat结构中的st_uid成员表示,组所有者则由st_gid成员表示。当执行一个文件时,进程的有效用用户ID通常就是实际用户ID,有效组ID通常是实际组ID。

3.2 访问权限位表示

每个文件有9个访问权限位,可分为三类,存放在st_mode里:
在这里插入图片描述
注意:读权限和执行权限的区别,读权限是我们可以查看该文件下的目录,但当我们通过这个目录组成路径名,去搜索一个特定的文件名,则需要执行权限。

3.3 新文件和目录的所有权

创建一个文件或者删除时,内核就进行文件访问权限测试。测试步骤如下:
在这里插入图片描述
acess函数是按实际用户ID和实际组ID进行访问权限测试的:

#include<unistd.h>
int access(const char* pathname,int mode);

mode常量可选项如下:
在这里插入图片描述

3.4 umask/chmod/fchmod

#include<sys/stat.h>
mode_t umask(mode_t cmask);
int chmod(const char* pathname,mode_t mode);
int fchmod(int fd,mode_t mode);

umak函数为进程设置文件屏蔽字,并返回以前的值。chmod与fchmod函数可以更改现有文件访问权限,前者通过文件名,后者通过文件描述符。

3.5 粘住位

如果对一个目录设置了粘住位,则只有对该目录具有写权限的用户在满足下列条件之一,才能删除或更名该目录下的文件:1.拥有此文件 2. 拥有此目录 3.是超级用户

4. 文件系统

unix文件系统基本结构是这样的:磁盘被分为一个或者多个分区,每个分区可以包含一个文件系统。
如下图:
在这里插入图片描述
i节点保存了文件的大部分信息,仔细观察i节点和数据块,便可知:
在这里插入图片描述
每个i节点都有链接计数,表示指向它的目录数,只有当链接计数为0,才可删除该文件。

  • 每一个文件系统都会对自己的i节点进行标号,所以这是这个文件的唯一表示。所以不能使一个目录项指向另一个文件系统的i节点。
  • i节点包含了stat结构体的大多信息,只有文件名、i节点存放在目录项。
  • mv命令为文件更名时,其实就是构造新目录项指向现有i节点,内容并没有移动。

5. 符号链接

符号链接是一个指向文件的间接链接,有了它,便可以将一个文件或者整个目录结构移到系统中的另一个位置。当open打开文件时,如果传递给open的参数是符号链接,那么open会跟随这个链接找到指定的文件。符号链接也就是常说的软链接。但注意cat打开符号链接,会失败。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值