Linux文件状态信息与权限

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

  1. 文件类型

    宏(参数为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("文件是普通文件")
  2. 权限属性

  3. 黏着位(保存正文位(saved text bit)S_ISVTX)

    若一个可执行程序的黏着位被设置,则程序第一次执行终止时,将程序正文的副本(机器指令)保存在交换区。

  4. 执行时设置用户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一致

  1. pathname参数为绝对路径
  2. pathname参数为相对路径,且fd参数为AT_FDCMD

faccessat测试相对于打开目录(fd)的pathname.

  • mode参数

    1. 测试文件是否存在:F_OK
    2. 测试访问权限: 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一致

  1. pathname参数为绝对路径
  2. 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值