内容简介:函数原型文件信息结构文件类型信息包含在
1 stat、fstat、fstatat
和 lstat
函数
函数原型
# include <sys/stat.h> int stat(const char *restrict pathname, sturct stat *restrict buf); int fstat(int fd, struct stat *buf); int lstat(const char *restrict pathname, struct stat *restrict buf); int fstatat(int fd, const char *restrict pathname, struct stat *restrict buf, int flag);
- stat 返回此命名文件的信息结构
-
fstat 返回文件描述符
fd
上打开的文件有关信息 - lstat 返回链接文件的信息,而不是该符号链接的文件的信息
-
fstatat 返回当前打开的目录(有
fd
指向) 的路径名文件统计信息
文件信息结构
struct stat{ mode_t st_mode; /*file type & mode (permission) */ ino_t st_ino; /*i-node number (serial number)*/ dev_t st_dev; /*device number (file system)*/ dev_t st_rdev; /*device number for special files*/ nlink_t st_nlink; /*number of links*/ uid_t st_uid; /*user ID of the owner*/ gid_t st_gid; /*group ID of the owner*/ off_t st_size; /*sieze in bytes, for regular files */ struct timespec st_atime; /*time of last access */ struct timespec st_mtime; /* time of last modification */ struct timespec st_ctime; /* time of last file status change */ blksize_t st_blksize; /*best I/O block size */ blkcnt_t st_blocks; /*number of disk blocks allocated */ };
2 文件类型
-
普通文件 (
regualr file
) -
目录文件(
directory file
) -
块特殊文件(
block special file
) 提供对设备带缓冲的访问; -
字符特殊文件(
character special file
)提供设备不带缓冲的访问; -
FIFO
用于进程之间之间的通信,又称为命令管道; -
套接字(
socket
) 用于进程之间网络通信; -
符号链接(
symbolic link
) 文件指向另一个文件;
文件类型信息包含在 st_mode
字段中。可以通过相关的宏确定文件类型。
3 用户 ID
和组 ID
一个进程关联的 ID
如下
-
我们实际上是谁(从登陆口令文件中获取)
- 实际用户 ID
- 实际组 ID
-
用于文件访问权限检查(通常与实际用户 ID 和 实际组 ID 相同)
- 有效用户 ID
- 有效组 ID
- 附属组 ID
-
由
exec
函数保存(执行时候包含有效用户 ID 和有效组 ID 的副本)- 保存的设置用户 ID
- 保存的设置组 ID
通常有效用户 ID 等于实际用户 ID, 有效组 ID 等于实际组 ID。在 st_mode
中设置一个特殊标志,当执行这个文件时候,进程有效用户 ID 为文件所有者 ID, 有效组等于文件所有组 ID。
4 文件访问权限
每个文件都有 9 个访问位权限,可以分为3类
-
用户相关
-
S_IRUSR
用户读 -
S_IWUSR
用户写 -
S_IXUSR
用户执行
-
-
组相关
-
S_IRGRP
组读 -
S_IWGRP
组写 -
S_IXGRP
组执行
-
-
其他相关
-
S_IROTH
其他读 -
S_IWOTH
其他写 -
S_IXOTH
其他执行
-
可以使用 chmod
可以修改这 9 个权限, u
表示用户(所有者), g
表示组, o
表示其他。补充说明
- 如果用名字打开任一类型的文件,该名字中包含的每一个目录都是可执行的。读权限只能获得该目录中文件名列表;
- 对文件的读写权限决定了是否能够打开现有文件读写操作;
-
open
函数中指定O_TRUNC
标志,必须要求对文件有写权限; - 在目录总创建新文件,必须对目录有写和执行权限;
- 删除一个文件,必须要改文件的目录写和执行权限,而不管文件本身读写权限;
-
exec
函数执行任何一个文件,必须这个文件有执行权限(必须是普通文件)
进程每次打开、创建和删除文件的时候,内核需要进行如下测试
-
若进程有效用户 ID 是
0
(超级用户),则允许访问; - 如果进程用户 ID 等于文件所有者 ID,则按照文件的所有者访问权限设置;
- 如果进程有效组 ID等于文件组 ID, 则按照文件所有组访问权限设置;
- 如果进程是其他用户,按照文件其他用户访问权限设置。
上述步骤只能从上到下,并且只能选择其中的一个。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。