4.2stat、fstat和lstat函数
#include <sys/stat.h> 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); 三个函数的返回值:若成功则返回0,若出错则返回-1
- 一旦给pathname,stat函数就返回与此命名文件有关的信息结构。fstat函数获取已在描述符filedes上打开文件的有关信息。lstat函数类似于stat,但是当命名文件是一个符号链接时,lstat返回该符号链接的有关信息,而不是该符号链接引用文件的信息。
struct stat { mode_t st_mode; /* file type & mode (permissions) */ ino_t st_ino; 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; };
4.3文件类型
- 文件类型包括以下几种:
- 普通文件。
- 目录文件。这种文件包含了其他文件的名字以及指向这些文件有关信息的指针。
- 块特殊文件。这种文件类型提供对设备(例如磁盘)带缓冲的访问,每次访问以固定长度为单位进行。
- 字符特殊文件。这种文件类型提供对这杯不带缓冲的访问,每次访问长度可变。
- FIFO。用于进程间通信。
- 套接字。用于进程间的网络通信。
- 符号链接。
- 文件的类型信息包含在stat结构的st_mode成员中。可以用表4-1中的宏确定文件类型。这些宏的参数都是stat结构中的st_mode成员。
表4-1中的文件类型宏 宏 文件类型 S_ISREG() 普通文件 S_ISDIR() 目录文件 S_ISCHR() 字符特殊文件 S_ISBLK() 块特殊文件 S_ISFIFO() 管道或FIFO S_ISLNK() 符号链接 S_ISSOCK() 套接字
- 表4-2中的宏可用来确定IPC对象的类型,这些宏的参数并非st_mode,而是指向stat结构的指针。
表4-2中的IPC类型宏 宏 对象类型 S_TYPEISMQ() 消息队列 S_TYPEISSEM() 信号量 S_TYPEISSHM() 共享存储对象
4.4设置用户ID和设置组ID
- 与一个进程相关的ID有6个或更多,他们示于表4-4中
表4-4与每个进程相关的用户ID和组ID 实际用户ID 我们实际上是谁
实际组ID有效用户ID 用于文件访问权限检查
有效组ID
附加组ID保存的设置用户ID 由exec函数保存
保存的设置组ID - 每个文件都有一个所有者和组所有者,所有者由stat结构中的st_uid成员表示,组所有者则有st_gid成员表示。
- 在文件模式字(st_mode)中设置一个特殊标志,其含义是“当执行此文件时,将进程的有效用户ID设置为文件所有者的用户ID(st_uid)”。与此类似,在文件模式字中可以设置另一位,它使得将执行此文件的进程的有效组ID设置为文件的组所有者ID(st_gid)。在文件模式字中的这两位被称为设置用户ID(set-usr-ID)位和设置组ID(set-group-ID)位。这两位可用常量S_ISUID和S_ISGID测试。
4.5文件访问权限
-
表4-5 9个访问权限位,取自 st_mode屏蔽 意义 S_IRUSR
S_IWUSR
S_IXUSR用户-读
用户-写
用户-执行S_IRGRP
S_IWGRP
S_IXGRP组-读
组-写
组-执行S_IROTH
S_IWOTH
S_IXOTH其他-读
其他-写
其他-执行 - 对于目录的读权限和执行权限的意义是不相同的。读权限允许我们读目录,获得在该目录中所有文件名的列表。当一个目录是我们要访问文件的路径名的一个组成部分时,对该目录的执行权限是我们可以通过该目录(也就是搜索该目录,寻找一个特定的文件名)。
4.6新文件和目录的所有权
- 新目录的所有全和新文件的所有权规则相同。
- 新文件的用户ID设置为进程有效用户ID。关于组ID,POSIX.1允许实现选择下列之一作为新文件的组ID。
- 新文件的组ID可以是进程的有效组ID。
- 新文件的组ID可以是它所在目录的组ID。(在linux中如设置了set-group-ID位时,使用第二步)。