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);