fstat、stat、lstat
获取文件状态信息(status)。
原型
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
int fstat(int fildes, struct stat *buf);
int stat(const char *path, struct stat *buf);
int lstat(const char *path, struct stat *buf);
将文件状态信息写入buf指向的stat结构.
stat结构
struct stat {
mode_t st_mode; /* File type and mode(permission) */
ino_t st_ino; /* Inode number */
dev_t st_dev; /* ID of device containing file */
dev_t st_rdev; /* Device ID (if special file) */
nlink_t st_nlink; /* Number of hard links */
uid_t st_uid; /* User ID of owner */
gid_t st_gid; /* Group ID of owner */
off_t st_size; /* Total size, in bytes */
struct timespec st_atim; /* Time of last access */
struct timespec st_mtim; /* Time of last modification */
struct timespec st_ctim; /* Time of last status change */
blksize_t st_blksize; /* Block size for filesystem I/O */
blkcnt_t st_blocks; /* Number of 512B blocks allocated */
};
- st_mode
mode_t st_mode; //unsigned int,只用了低16位
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-weVcpheJ-1644655890496)(C:\Users\14595\AppData\Roaming\Typora\typora-user-images\image-20220209231636612.png)]
-
文件类型
宏(参数为st_mode) 文件类型 S_ISREG() 普通(regular)文件 S_ISDIR() 目录(directory)文件 S_ISLNK() 符号链接(link) S_ISCHR() 字符(character)特殊文件 S_ISBLK() 块(block)特殊文件 S_ISSOCK() 套接字(socket) S_ISFIFO() 管道或FIFO 示例:
if(S_ISREG(buf.st_mode)) printf("文件是普通文件");
-
权限属性
-
黏着位(保存正文位(saved text bit)S_ISVTX)
若一个可执行程序的黏着位被设置,则程序第一次执行终止时,将程序正文的副本(机器指令)保存在交换区。
-
执行时设置用户ID和组ID
//文件类型属性区域
#define S_IFMT 0170000 文件类型的位遮罩
#define S_IFSOCK 0140000 socket
#define S_IFLNK 0120000 符号链接(symbolic link)
#define S_IFREG 0100000 一般文件
#define S_IFBLK 0060000 区块装置(block device)
#define S_IFDIR 0040000 目录
#define S_IFCHR 0020000 字符装置(character device)
#define S_IFIFO 0010000 先进先出(fifo)
#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) //提供了一些宏来帮助用户执行&操作,是则返回1
#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
#define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
#define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
#define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
//权限的特殊属性区域
#define S_ISUID 0004000 文件的(set user-id on execution)位
#define S_ISGID 0002000 文件的(set group-id on execution)位
#define S_ISVTX 0001000 文件的sticky位
//权限属性区域
//文件所有者(owner)
#define S_IRWXU 00700 /* mask for file owner permissions */
#define S_IRUSR 00400 /* owner has read permission */
#define S_IWUSR 00200 /* owner has write permission */
#define S_IXUSR 00100 /* owner has execute permission */
//组用户(group)
#define S_IRWXG 00070 /* mask for group permissions */
#define S_IRGRP 00040 /* group has read permission */
#define S_IWGRP 00020 /* group has write permission */
#define S_IXGRP 00010 /* group has execute permission */
//其他用户(other)
#define S_IRWXO 00007 /* mask for permissions for others (not in group) */
#define S_IROTH 00004 /* others have read permission */
#define S_IWOTH 00002 /* others have write permission */
#define S_IXOTH 00001 /* others have execute permission */
access和faccessat
以实际用户ID和实际组ID测试访问权限。
#include<unistd>
int access(const char *pathname,int mode);
int faccessat(int fd,const char *pathname,int mode,int flag);
以下两种情况access与faccessat一致
- pathname参数为绝对路径
- pathname参数为相对路径,且fd参数为AT_FDCMD
faccessat测试相对于打开目录(fd)的pathname.
-
mode参数
- 测试文件是否存在:F_OK
- 测试访问权限: R_OK, W_OK, X_OK的按位或 (分别为读、写和执行权限)。
-
flag参数
用于改变faccessat的行为。
返回值
成功时返回0,出错时返回-1.
umask系统调用
控制文件的默认权限。
#include<sys/stat.h>
mode_t umask(mode_t cmask);
cmask为以下9个常量的若干个按位或组成。位为1则相应权限被关闭。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BGNQHQTT-1644655890498)(C:\Users\14595\AppData\Roaming\Typora\typora-user-images\image-20220210212619807.png)]
chmod、fchmod和fchmodet
更改现有文件的访问权限。
#include<sys/stat.h>
int chmod(const char *pathname,mode_t mode);
int fchmod(int fd,mode_t mode);
int fchmodat(int fd,const char *pathname,mode_t mode,int flag);
返回值
成功时返回0;出错时返回-1.
以下两种情况fchmod与fchmodat一致
- pathname参数为绝对路径
- pathname参数为相对路径,且fd参数为AT_FDCMD
fchmodat测试相对于打开目录(fd)的pathname.
flag参数
用于改变fchmodat的行为。
当设置为AT_SYMLINK_NOFOLLOW时,dosen’t follow symbolic links.
chown、fchown、fchownat、和lchown
更改文件的用户ID和组ID.
#include<unistd.h>
int chown(const char *pathname,uid_t owner,gid_t group);
int lchown(const char *pathname,uid_t owner,gid_t group);
int fchown(int fd,uid_t owner,gid_t group);
int fchownat(int fd,const char *pathname,uid_t owner,gid_t group,int flag);
owner或group参数为-1,则对应的ID不变。
- 当所引用的文件是符号链接时,函数使用以下,来更改符号链接本身。
- lchown
- fchownat, flag参数设为AT_SYMLINK_NOFOLLOW
gid_t group);
int fchownat(int fd,const char *pathname,uid_t owner,gid_t group,int flag);
owner或group参数为-1,则对应的ID不变。
- 当所引用的文件是符号链接时,函数使用以下,来更改符号链接本身。
- lchown
- fchownat, flag参数设为AT_SYMLINK_NOFOLLOW