int stat(const char *restrict pathname, struct stat *restrict buf);
int fstat(int filedes, struct stat * buf);
int lstat(const char *restrict pathname, struct stat *restrict buf);
lstat和前面2个区别是 当读取符号链接的时候,读取的符号链接的信息,而不是符号链接引用文件的信息
文件类型及测试
Unix系统中大多数文件是普通文件或目录,但是也有一些其他特殊的文件类型。
普通文件
目录文件
块特殊文件
这种文件类型提供对设备带缓冲的访问,每次访问以固定长度为单位进行。字符特殊文件
这种文件类型提供对设备不带缓冲的访问,每次访问的长度可变。系统中的所有设备要么是字符特殊文件
,要么是块特殊文件
FIFO
这种类型的文件用于进程间通信,有时也将其称为命名管道(named pipe).套接字
这种文件类型用于进程间的网络通信。 套接字也可用在一台宿主机器上的进程间的非网络通信。符号链接
这种文件类型指向另一个文件。
sys/stat.h
中定义了一些宏,用于测试文件类型。这些宏的使用需要输入stat结构的st_mode成员。
宏 | 文件类型 |
---|---|
S_ISREG() | 普通文件 |
S_ISDIR() | 目录文件 |
S_ISCHR() | 字符特殊文件 |
S_ISBLK() | 块特殊文件 |
S_ISFIFO() | 管道或FIFO |
S_ISLNK() | 符号链接 |
S_ISSOCK() | 套接字 |
posix.1允许实现将进程间通信对象,如消息队列,信号量等表示为文件。下面的宏可以用来测试IPC对象的类型。这些宏的输入参数与上表不同,是指向stat结构的指针。
宏 | 对象类型 |
---|---|
S_TYPEISMQ() | 消息队列 |
S_TYPEISSEM() | 信号量 |
S_TYPEISSHM() | 共享存储对象 |
文件访问权限
文件权限的表示如下
111 101 101
(二进制) 或者 755
(8进制)
每三个二进制位或者1个8进制位 分别表示用户所有者的权限,用户所在组的权限,其他用户或者组的权限
其中每个权限里,第一个bit位表示读权限(r)
,第二个bit位表示写权限(w)
,第三个表示执行权限(x)
关于文件权限,有以下几点需要注意
- 打开某文件时,对该文件所包含的每一个目录,包括它可能隐含的当前工作目录都需要具有执行权限
- 目录的执行权限也被称为
搜索位
。读权限允许我们读取目录,获得目录中所有文件的列表。但是当我们要访问该目录下的文件时,必须要有执行权限。 - 为了在一个目录中创建一个新文件,必须要有该目录的写权限和执行权限。
- 为了删除一个现有文件时, 必须要有包含该文件的目录的写权限和执行权限。对该文件本身的权限则没有要求。
- 使用6个exec函数执行任意一个文件,都必须要有该文件的执行权限,而且该文件必须还是一个普通文件。
int access(const char* pathname, int mode);
函数成功返回0,失败返回-1
mode | 说明 |
---|---|
R_OK | 测试读权限 |
W_OK | 测试写权限 |
X_OK | 测试执行权限 |
F_OK | 测试文件是否存在 |
mode_t umask(mode_t cmask);