文件系统特征和文件的性质
函数stat,fstat,fstatat,lstat <sys/stat.h>
int stat(const char * restrict pathname,struct stat* restrict buf);
int fstat(int fd,struct stat* buf);
int lstat(const char* restrict pathname,struct stat* restrict buf,int flag);
int fstatat(int fd,const char* restrict pathname,struct stat* restrict buf,int flag)
一但给出pathname,stat函数返回与此命名文件有关的信息结构,
fstat函数获得已在描述符fd上打开文件的有关信息, ll
lstat函数类似于stat,但是当命名的文件是一个符号链接时,lstat返回符号链接的有关信息,而不是由该符号链接引用的文件的信息,
fstatat函数为一个相对于当前打开目录(由fd指向)的路径名返回文件统计信息
struct stat {
mode_t st_mode; //文件对应的模式,文件,目录等(包含对文件的访问权限)
ino_t st_ino; //inode节点号
dev_t st_dev; //设备号码
dev_t st_rdev; //特殊设备号码
nlink_t st_nlink; //文件的连接数
uid_t st_uid; //文件所有者
gid_t st_gid; //文件所有者对应的组
off_t st_size; //普通文件,对应的文件字节数
time_t st_atime; //文件最后被访问的时间
time_t st_mtime; //文件内容最后被修改的时间
time_t st_ctime; //文件状态改变时间
blksize_t st_blksize; //文件内容对应的块大小
blkcnt_t st_blocks; //伟建内容对应的块数量
};
文件类型:
普通文件
目录文件
块特殊文件
字符特殊文件
FIFO
套接字
符号链接
POSIX允许将进程间通信(IPC)对象说明为文件
设置用户ID和设置组ID
与一个进程相关联的ID有6个或者更多
实际用户ID 用于标志我们是谁,在登录时取自口令文件登录项
实际组ID 用于标志我们是谁,在登录时取自口令文件登录项
有效用户ID 用于文件访问权限检查
有效组ID 用于文件访问权限检查
所属组ID 用于文件访问权限检查
保存的设置用户ID 由exec函数保存
保存的设置组ID 由exec函数保存
通常有效用户ID等于实际用户ID,有效组ID等于实际组ID
可以在文本字模式(st_mode)中设置一个特殊标志位(suid)让当执行此文件时,进程的有效用户ID设置为文件所有者的ID 相应的,可以设置sgid来让有效组ID设置为文件的组所有者ID
文件访问权限:
S_IRUSR S_IRGRP S_IRGOTH
S_IWUSR S_IWGRP S_IWOTH
S_IXUSR S_IXGRP S_IXOTH
chmod命令允许我们用u表示用户,g表示组,o表示其他
权限规则:
要打开某一个文件,需要对其从更目录到文件所在目录中间的所有目录都应该具有执行权限(x)(决定能否进入该目录) 对于目录,其执行权限(x)常被称为搜索位
读权限允许我们读目录,获取在该文件中所有文件名的列表
对一个文件的读权限决定了我们能否打开现有文件进行读操作,与open函数的O_RDONLY和O_RDWR有关
对一个文件的写操作决定了我们能否打开现有文件进行写操作,与open函数的O_WRONLY和O_RDWR有关
权限对于文件:
r 读取一个档案的实际内容
w 编辑,新增,修改文件的内容(不包括删除文件的权限)
x 该文件是否可以被系统执行
权限对于目录:
r 读取目标结构清单的权限
w 建立新的文件与目录 删除已经存在的文件与目录(不管文件的权限如何) 重命名已经存在的文件以及目录 移动文件以及目录的权限
x 使用者能否进入该目录并使之成为工作目录
新文件和目录的所有权
新文件的用户ID为进程的有效ID
新文件的组ID为进程的有限组ID也可以是它所在目录的组ID 对于linux新文件的组ID取决于他所在的目录的组ID是否被设置,如果设置,文件的组ID即目录的组ID,如果未设置,新文件的组ID为进程的组ID
函数access和faccessat <unistd.h>
access和faccessat函数以实际用户ID和实际组ID而不是进程ID和进程组ID来进行访问测试
int access(const cahr* pathname,int mode);
it faccessat(int fd,const char* pathname,int mode,int flag);
返回值:若成功,返回0,若失败,返回-1
mode R_OK(读权限测试) W_OK(写权限测试) X_OK(执行权限测试)
flag参数可以用来改变faccessat函数的行为,如果flag设置为AT_EACCESS,访问检查用的是调用进程的有效用户ID和有效组ID,而不是实际用户ID和实际组ID
函数umask: <sys/stat.h>
mode_t umask(mode_t cmask); umask函数为进程设置文件模式创建屏蔽字,并返回之前的值,(没有出错返回函数)
cmask由上面6个文件访问权限常量按位或构成
在进程创建一个新文件或新目录的时候,通过文件模式创建屏蔽字
open和creat函数中的参数mode指定了新文件的访问权限位 创建一个新文件或目录时,在文件模式创建屏蔽字为1的位,在文件mode中的相应位被关闭
子进程的umask屏蔽字不影响父进程的umask屏蔽字
函数chmod,fchmod,fchmodat <sys/stat.h>
int chmod(const char* pathname,mode_t mode); 在指定的文件上进行操作
int fchmod(int fd,mode_t mode); 对已打开的文件进行操作
int fchmodat(int fd,const char* pathname,mode_t mode,int flag);
flag参数用于改变fchmodat的值,当设置为AT_SYMLINK_NOFOLLOW时,fchmodat不会跟随符号链接
当fd设置为AT_FDCWD时,path为相对路径,否则默认为相对于打开目录(fd)进行查找
为了改变一个文件的权限位,进程的有效用户ID必须等于文件的所有者ID,或者具有root权限
参数mode:
S_IRWXU(全操作) S_IRWXG(全操作) S_IREXO(全操作)
S_ISUID(SUID) S_IRUSR S_IRGRP S_IROTH
S_ISGID(SGID) S_IWUSR S_IWGRP S_IROTH
S_ISVTX保存正文(粘着位) S_IXUSR S_IXGRP S_IXOTH
组执行权限为S表示设置组ID位已经设置,同时,组执行位未设置
只有超级用户才能设置普通文件的粘着位(FreeBSD和Solaris系统中,Mac和Linux无限制(因为对普通文件无意义))
粘着位:
函数chown,fchown,fchownat,lchown <unistd.h>
文件长度
文件中的空洞
文件截断
文件系统
函数link,linkat,unlink,unlinkat,remove
函数rename,renameat <stdio.h>
符号链接
创建读取符号链接
文件时间
函数futimens,utimensat,utime <sys/stat.h>
函数mkdir,mkdirat,rmdir <sys/stat.h>
读目录
函数chdir,fchdir,getcwd <unistd.h>
设备特殊文件
文件访问权限小结