Linux如何用C代码获取文件的权限

1、struct stat介绍

我们在Linux中每个文件都对应的有相应的属性,这些属性都保存在一个叫struct stat的结构体中,其中的属性如下。

内核中struct stat 结构体:

struct stat {
        mode_t     st_mode;       //文件对应的模式,文件,目录等
        ino_t      st_ino;       //inode节点号
        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;     //伟建内容对应的块数量

      }; 

stat结构体中的st_mode 则定义了下列数种情况:

   S_IFMT   0170000    文件类型的位遮罩
   S_IFSOCK 0140000    scoket
   S_IFLNK 0120000     符号连接
   S_IFREG 0100000     一般文件
   S_IFBLK 0060000     区块装置
   S_IFDIR 0040000     目录
   S_IFCHR 0020000     字符装置
   S_IFIFO 0010000     先进先出

   S_ISUID 04000     文件的(set user-id on execution)位
   S_ISGID 02000     文件的(set group-id on execution)位
   S_ISVTX 01000     文件的sticky位

   S_IRUSR(S_IREAD) 00400     文件所有者具可读取权限
   S_IWUSR(S_IWRITE)00200     文件所有者具可写入权限
   S_IXUSR(S_IEXEC) 00100     文件所有者具可执行权限

   S_IRGRP 00040             用户组具可读取权限
   S_IWGRP 00020             用户组具可写入权限
   S_IXGRP 00010             用户组具可执行权限

   S_IROTH 00004             其他用户具可读取权限
   S_IWOTH 00002             其他用户具可写入权限
   S_IXOTH 00001             其他用户具可执行权限

2、获取文件权限

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

int main(int argc,char *argv[])
{
	unsigned int i,mask=0700;
	struct stat buff;
	static char *perm[]={"---","--x","-w-","-wx","r--","r-x","rw-","rwx"};
	if(argc>1)
	{
		if((stat(argv[1],&buff)!=-1))
		{
			printf("permissions for %s\t",argv[1]);
			for(i=3;i;--i)
			{
				printf("%3s",perm[(buff.st_mode&mask)>>(i-1)*N_BITS]);
				mask>>=N_BITS;
			}
			putchar('\n');
		}
		else
		{
			perror(argv[1]);
			exit(1);
		}
	}
	else
	{
		fprintf(stderr,"Usage:%s file_name\n",argv[0]);
	}
	return 0;
}

3、编译运行

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值