struct stat结构体中st_mode参数的含义

本文详细解读了Linux系统中stat结构体内的st_mode成员,包括文件类型的表示方法、sticky位的作用及其权限设置等内容。
stat 结构体重 st_mode 参数的含义
关于st_mode参数的定义:
由于在文件系统编程中经常会用到这个结构,网上很多含糊其辞,下面是我在网上搜索的,整理如下,如果可以的话,应该去源码下搜索一下
st_mode 应该是一个32为的整形变量,现在的linux系统只用了其中的前16位(0-15)
 
第15位:其实这一位只用到了一次:
        0170000 (和12-14位合起来,是获得文件类型的屏蔽信息)
12-14位:三位确定了文件的类型(linux文件的类型总共有7中,三位就够了)
11-10位: 这2位分别是是文件用户id和组id位
这个Sticky Bit当前只针对目录有效,对文件没有效果。SBit对目录的作用是:“在具有SBit的目录下,用户若在该目录下具有w及x权限,则当用户在该目录下建立文件或目录时,只有文件拥有者与root才有权力删除”。换句话说:当甲用户在A目录下拥有group或other的项目,且拥有w权限,这表示甲用户对该目录内任何人建立的目录或文件均可进行“删除/重命名/移动”等操作。不过,如果将A目录加上了Sticky bit的权限,则甲只能够针对自己建立的文件或目录进行删除/重命名/移动等操作。
 
举例来说,/tmp本身的权限是“drwxrwxrwt”,在这样的权限内容下,任何人都可以在 /tmp内新增、修改文件,但仅有该文件/目录的建立者与root能够删除自己的目录或文件。这个特性也很重要。可以这样做个简单测试:
 以root登入系统,并且进入 /tmp中。
 touch test,并且更改test权限成为777。
 以一般用户登入,并进入 /tmp。
 尝试删除test文件。
发现删除不了,说明这一问题。。。。
8-0位:这就是文件的访问权限的集合了,我就比多说了,这个好理解(这些事linux的基本知识了)
为了操作其中的各个位,系统提够了一些函数和宏,并且也有一些用户可以用一些与操作来访问,就不多说了。。。
int main(int argc, char *argv[]) { struct stat file_stat; stat(argv[1],&file_stat); DIR * dp = opendir(argv[1]); if(NULL == dp) { perror("opendir"); return -1; } struct dirent * p = NULL; while(1) { p = readdir(dp); if(p == NULL) { break; } if(p->d_name[0] == '.') //不显示隐藏文件 continue; if(S_ISREG(file_stat.st_mode)) { printf("-"); } else if(S_ISBLK(file_stat.st_mode)) { printf("b"); } else if(S_ISCHR(file_stat.st_mode)) { printf("c"); } else if(S_ISDIR(file_stat.st_mode)) { printf("d"); } else if(S_ISLNK(file_stat.st_mode)) { printf("l"); } else if(S_ISFIFO(file_stat.st_mode)) { printf("p"); } else if(S_ISSOCK(file_stat.st_mode)) { printf("s"); } if(file_stat.st_mode & S_IRUSR) printf("r"); else printf("-"); if(file_stat.st_mode & S_IWUSR) printf("w"); else printf("-"); if(file_stat.st_mode & S_IXUSR) printf("x"); else printf("-"); if(file_stat.st_mode & S_IRGRP) printf("r"); else printf("-"); if(file_stat.st_mode & S_IWGRP) printf("w"); else printf("-"); if(file_stat.st_mode & S_IXGRP) printf("x"); else printf("-"); if(file_stat.st_mode & S_IROTH) printf("r"); else printf("-"); if(file_stat.st_mode & S_IWOTH) printf("w"); else printf("-"); if(file_stat.st_mode & S_IXOTH) printf("x"); else printf("-"); printf(" "); printf("%ld",file_stat.st_nlink); printf(" "); struct passwd * file_passwd; file_passwd=getpwuid(file_stat.st_uid); printf("%s",file_passwd->pw_name); printf(" "); struct group * file_group; file_group=getgrgid(file_stat.st_gid); printf("%s",file_group->gr_name); printf(" "); printf("%ld",file_stat.st_size); printf(" "); printf("%s\n",p->d_name); printf("\n"); } return 0; } 为什么只有文件名在变
08-07
int main(int argc, char *argv[]) { struct stat file_stat; stat(argv[1],&file_stat); if(S_ISREG(file_stat.st_mode)) { printf("-"); } else if(S_ISBLK(file_stat.st_mode)) { printf("b"); } else if(S_ISCHR(file_stat.st_mode)) { printf("c"); } else if(S_ISDIR(file_stat.st_mode)) { printf("d"); } else if(S_ISLNK(file_stat.st_mode)) { printf("l"); } else if(S_ISFIFO(file_stat.st_mode)) { printf("p"); } else if(S_ISSOCK(file_stat.st_mode)) { printf("s"); } if(file_stat.st_mode & S_IRUSR) printf("r"); else printf("-"); if(file_stat.st_mode & S_IWUSR) printf("w"); else printf("-"); if(file_stat.st_mode & S_IXUSR) printf("x"); else printf("-"); if(file_stat.st_mode & S_IRGRP) printf("r"); else printf("-"); if(file_stat.st_mode & S_IWGRP) printf("w"); else printf("-"); if(file_stat.st_mode & S_IXGRP) printf("x"); else printf("-"); if(file_stat.st_mode & S_IROTH) printf("r"); else printf("-"); if(file_stat.st_mode & S_IWOTH) printf("w"); else printf("-"); if(file_stat.st_mode & S_IXOTH) printf("x"); else printf("-"); printf(" "); printf("%ld",file_stat.st_nlink); printf(" "); struct passwd * file_passwd; file_passwd=getpwuid(file_stat.st_uid); printf("%s",file_passwd->pw_name); printf(" "); struct group * file_group; file_group=getgrgid(file_stat.st_gid); printf("%s",file_group->gr_name); printf(" "); printf("%ld",file_stat.st_size); printf("\n"); return 0; int main(int argc, char *argv[]) { DIR * dp = opendir(argv[1]); if(NULL == dp) { perror(“opendir”); return -1; } struct dirent * p = NULL; while(1) { p = readdir(dp); if(p == NULL) { break; } if(p->d_name[0] == ‘.’) //不显示隐藏文件 continue; printf(“%s\n”,p->d_name); } return 0; } 基于这些代码如何实现ls -l的效果
08-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值