引言
本章描述文件系统的其他特征和文件的属性,以及修改这些属性的函数。
文件类型
UNIX系统文件类型:
-:普通文件
d: 目录
b: 块设备
c: 字符设备
l: 链接文件
p: 管道
s: 套接字
获取文件信息
stat、fstat、fstatat、lstat
这几个函数都是获取文件相关的信息。
这些函数不常用到,知道作用即可。用到时查询函数原型。
文件权限
- 访问权限:包括所属用户、组和其他用户的权限,每个对应读、写、执行。
例如,-rwxr–r--,即所属用户对该文件具有读、写、执行权限。所属组具有读权限。其他用户具有读权限。 - 所属用户和所属组
例如,
$ls -l /usr/bin/passwd
$-rwsr-xr-x 1 root root 54256 5月 17 2017 /usr/bin/passwd
其中,第一个root为有效所属用户。第二个root为有效所属组
3. 实际用户和有效用户
实际用户和有效用户的区别及作用:
实际用户ID或实际组ID: 标识这个文件实际是谁拥有。
有效用户ID/有效组ID/附属组ID:用于文件访问权限检查。
一般而言,有效用户就是实际用户。
而当这种情况:有两个用户A和B,一个可执行文件bin,bin文件的所属用户为A。
当使用用户B登录系统时,运行bin进程,则bin进程有一个实际用户和有效用户。
其中,实际用户为该文件的拥有者即A。
而有效用户是谁要看bin文件的属性,当bin文件的属性中设置了“设置用户ID位”时,有效用户为实际用户即A,否则为B
设置用户ID位,就是例如上面passwd文件属性中的s。
进程有效用户的意义在于,进程去访问一个文件时,内核需要进行文件访问权限测试,内核将比较进程的有效用户ID和待访问文件中关于该有效用户的权限,判断是否满足访问条件。
文件相关函数
测试文件权限
access和faccessat函数:
这两个函数用于测试进程的实际用户和待测试文件的权限比较。
函数声明:
#incldue <unistd.h>
int access(const char *pathname, int mode);
int faccessat(int fd, const char *pathname, int mode, int flag);
参数:
pathname:文件名
mode:
R_OK: 测试读权限
W_OK: 测试写权限
X_OK: 测试执行权限
flag:
当flag设置为AT_EACCESS,访问检查的是调用进程的有效用户和有效组,而不是实际用户和实际组。
返回值:
success: 0
fail: -1
控制创建文件权限
umask函数:进程创建新文件或新目录之前,控制所创建文件的默认权限。在进程中被调用,不影响系统本身的umask值(默认权限)
函数声明:
#include <sys/stat.h>
mode_t umask(mode_t cmask)
参数:
mode_t cmask:权限位,例如022,八进制
返回值:
之前的文件模式权限值
例1:
//设置了哪个位,哪个位的权限就被禁止
umask(0);// ==>777? 555
umask(022);// ==> 111 101 101
umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); // ==》500
创建和删除目录
mkdir、mkdirat创建目录。
rmdir删除目录
创建和删除链接文件
link、linkat、unlink、unlinkat和remove函数:关于链接文件(硬链接)的创建和删除。
symlink和symlinkat函数:创建符号链接(软链接)
更改文件访问权限
chmod、fchmod和fchmodat函数:更改现有文件的访问权限。
更改文件所属用户和组
chown、fchown、fchownat和lchown函数:更改文件的用户ID和组ID。
重命名
rename和renameat函数:对文件和目录重命名
获取和更改工作路径
chdir、fchdir:更改当前的工作目录
getcwd:获取当前工作目录的绝对路径