Linux系统编程-文件属性

背景:Linux系统编程-stat函数-CSDN博客

第一位是文件类型。这个红色框中的信息都存放在stat结构体的st_mode中。

2到4是user的权限,5到7是group的权限,8到10是other的权限,所以基本位有9位。u+s位,g+s位,o+t位。文件类型有7种,用位图来表示的话,3个二进制位就足够了。没有15位的位图,所以一定是16位。

dcb-lsp分别对应七种文件类型。

d是目录文件。
c表示字符设备文件。
b表示块设备文件。
-表示常规文件。
l表示符号链接文件。
s表示网络套接字socket文件。
p表示管道文件。


S_ISLNK(st_mode)	// 是否是一个连接.
S_ISREG(st_mode)	// 是否是一个常规文件.
S_ISDIR(st_mode)	// 是否是一个目录
S_ISCHR(st_mode)	// 是否是一个字符设备.
S_ISBLK(st_mode)	// 是否是一个块设备
S_ISFIFO(st_mode)	// 是否是一个FIFO文件.
S_ISSOCK(st_mode)	// 是否是一个SOCKET文件 

代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

static int ftype(const char *fname)
{
    struct stat statres;

    if (stat(fname, &statres) < 0)
    {
	perror("stat()");
	exit(1);
    }

    if(S_ISREG(statres.st_mode))
            return '-';
    else if (S_ISDIR(statres.st_mode))
	    return 'd';
    else if(S_ISSOCK(statres.st_mode))
	    return 's';
    else if(S_ISCHR(statres.st_mode))
	    return 'c';
    else if(S_ISBLK(statres.st_mode))
	    return 'b';
    else if(S_ISFIFO(statres.st_mode))
	    return 'p';
    else if(S_ISLNK(statres.st_mode))
	    return 'l';
    else
	    return '?';
}

int main(int argc, char **argv)
{
    if (argc < 2)
    {
	fprintf(stderr, "Usage...\n");
	exit(1);
    }

    printf("%c\n", ftype(argv[1]));

    exit(0);
}

运行,flen.c是常规文件,所以结果为-。

fs为目录,结果为d。

第一位为0,表示是八进制数,有5位,3*5再加上最高位的1,一共16位。st_mode是一个16位的位图。

#define S_IFMT   0170000
#define S_IFSOCK 0140000
#define S_IFLNK  0120000
#define S_IFREG  0100000
#define S_IFBLK  0060000
#define S_IFDIR  0040000
#define S_IFCHR  0020000
#define S_IFIFO  0010000

// u+s位,g+s位,t位
#define S_ISUID  0004000
#define S_ISGID  0002000
#define S_ISVTX  0001000

// 表示的是owner的权限
#define S_IRWXU 00700
#define S_IRUSR 00400
#define S_IWUSR 00200
#define S_IXUSR 00100

// 次低三次保留的是group用户的权限。
#define S_IRWXG 00070
#define S_IRGRP 00040
#define S_IWGRP 00020
#define S_IXGRP 00010

// 最低三位表示的是other用户的权限,想保留低三位的话,st_mode就与S_IRWXO按位与,前面都被抹掉,只保留第三位。
#define S_IRWXO 00007
#define S_IROTH 00004
#define S_IWOTH 00002
#define S_IXOTH 00001

st_mode是一个16位的位图,用于表示文件类型,文件访问权限,及特殊权限位。

  • 10
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值