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打开符号链接,会失败。