sturct stat 结构体中 st_mode 的含义

在<sys/stat.h>中定义的stat结构体内容如下:

[cpp] view plaincopyprint?
  1. struct stat {  
  2.                dev_t     st_dev;     /* ID of device containing file */  
  3.                ino_t     st_ino;     /* inode number */  
  4.                mode_t    st_mode;    /* protection */  
  5.                nlink_t   st_nlink;   /* number of hard links */  
  6.                uid_t     st_uid;     /* user ID of owner */  
  7.                gid_t     st_gid;     /* group ID of owner */  
  8.                dev_t     st_rdev;    /* device ID (if special file) */  
  9.                off_t     st_size;    /* total size, in bytes */  
  10.                blksize_t st_blksize; /* blocksize for file system I/O */  
  11.                blkcnt_t  st_blocks;  /* number of 512B blocks allocated */  
  12.                time_t    st_atime;   /* time of last access */  
  13.                time_t    st_mtime;   /* time of last modification */  
  14.                time_t    st_ctime;   /* time of last status change */  
  15.            };  

本文着眼于st_mode成员,该成员描述了文件的类型权限两个属性。

st_mode是个32位的整型变量,不过现在的linux操作系统只用了低16位(估计是鉴于以后拓展的考虑)。 

===============================================================================================================

先看File type属性区域,位于bit12 ~ bit15.

在现代linux操作系统上文件类型共分为7种,分别是:

普通文件(regular file)

目录(directory)

字符设备(character device)

块设备(block device)

管道(FIFO<pipe>)

符号链接文件(symbolic link)

套接口文件(socket)

所以File type属性只需3bit就够了,估计也是考虑到了以后的扩展问题。
 

在<sys/stat.h>中有如下定义:

[cpp] view plaincopyprint?
  1. #define S_IFMT  00170000  
  2. #define S_IFSOCK 0140000  
  3. #define S_IFLNK  0120000  
  4. #define S_IFREG  0100000  
  5. #define S_IFBLK  0060000  
  6. #define S_IFDIR  0040000  
  7. #define S_IFCHR  0020000  
  8. #define S_IFIFO  0010000  
  9. #define S_ISUID  0004000  
  10. #define S_ISGID  0002000  
  11. #define S_ISVTX  0001000  
  12.   
  13. #define S_ISLNK(m)      (((m) & S_IFMT) == S_IFLNK)  
  14. #define S_ISREG(m)      (((m) & S_IFMT) == S_IFREG)  
  15. #define S_ISDIR(m)      (((m) & S_IFMT) == S_IFDIR)  
  16. #define S_ISCHR(m)      (((m) & S_IFMT) == S_IFCHR)  
  17. #define S_ISBLK(m)      (((m) & S_IFMT) == S_IFBLK)  
  18. #define S_ISFIFO(m)     (((m) & S_IFMT) == S_IFIFO)  
  19. #define S_ISSOCK(m)     (((m) & S_IFMT) == S_IFSOCK)  


首先S_IFMT是一个掩码,它的值是017000(注意这里用的是八进制), 可以用来过滤出前四位表示的文件类型。

其后的连续七个分别对应套接口文件、符号链接文件、普通文件、块设备、目录、字符设备、管道,它们分别对应一个不同的值。

现在假设我们要判断一个文件是不是目录,我们怎么做呢?

很简单,首先通过掩码S_IFMT把其他无关的部分置0,再与表示目录的数值比较,从而判断这是否是一个目录,下面的代码:

[cpp] view plaincopyprint?
  1. if ((info.st_mode & S_IFMT) == S_IFDIR)  
  2.     printf("this is a directory");  


为了简便操作,<sys/stat.h>中提供了宏来代替上述代码,所以如果需要判断文件是不是目录就可以这样:

[cpp] view plaincopyprint?
  1. if (S_ISDIR(info.st_mode))  
  2.     printf("this is a directory");  

===============================================================================================================

 

接着来看Permission属性区域的bit0~bit8,也即st_mode字段的最低9位,代表文件的许可权限,它标识了文件所有者(owner)、组用户(group)、其他用户(other)的读(r)、写(w)、执行(x)权限。

在<sys/stat.h>有如下定义:

[cpp] view plaincopyprint?
  1. #define S_IRWXU 00700   /* mask for file owner permissions */  
  2. #define S_IRUSR 00400   /* owner has read permission */  
  3. #define S_IWUSR 00200   /* owner has write permission */  
  4. #define S_IXUSR 00100   /* owner has execute permission */  
  5.   
  6. #define S_IRWXG 00070   /* mask for group permissions */  
  7. #define S_IRGRP 00040   /* group has read permission */  
  8. #define S_IWGRP 00020   /* group has write permission */  
  9. #define S_IXGRP 00010   /* group has execute permission */  
  10.   
  11. #define S_IRWXO 00007   /* mask for permissions for others (not in group) */  
  12. #define S_IROTH 00004   /* others have read permission */  
  13. #define S_IWOTH 00002   /* others have write permission */  
  14. #define S_IXOTH 00001   /* others have execute permission */  

 程序中可以自由组合使用它们。===============================================================================================================

 

最后来看Permission属性区域的bit9 ~ bit11,这三个bit比较特殊,代表文件的特殊属性,分别为set-user-ID位、set-group-ID位和sticky位,下面一一介绍每个位的含义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB求解3对角系数矩阵方程,实验5.3 用追赶法求解三对角方程组

实验5.3 用追赶法求解三对角方程组实验目的会使用Matlab 语言编程使用追赶法求解线性方程组。实验原理设系数矩阵为三对角矩阵11222331110000000000000000n n n nn b c a b c a b A a b c a b ---?? ? ? ?? ? ?? ???则方程组Axf 称为三对角方程组。设矩阵A 非奇异&…

字符串操作以及打印 —— 实现上传下载的进度条功能

import sysdef processBar(num, total):rate num / totalrate_num int(rate * 100)if rate_num 100:r \r%s>%d%%\n % ( * rate_num, rate_num,)else:r \r%s>%d%% % ( * rate_num, rate_num,)sys.stdout.write(r)sys.stdout.flushprocessBar(10,100) 转载于:https://…

php去除每行的重复文本,php删除文本文件中重复行的方法

本文实例讲述了php删除文本文件中重复行的方法。分享给大家供大家参考。具体分析如下&#xff1a;这个php函数用来删除文件中的重复行&#xff0c;还可以指定是否忽略大小写&#xff0c;和指定换行符?1234567891011121314151617181920212223242526272829303132333435363738394…

Linux环境进程间通信(五): 共享内存(上)

Linux环境进程间通信&#xff08;五&#xff09;: 共享内存&#xff08;上&#xff09; 共享内存可以说是最有用的进程间通信方式&#xff0c;也是最快的IPC形式。两个不同进程A、B共享内存的意思是&#xff0c;同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即…

JS 跳出多重循环

今天学到了如何跳出多重循环 转载于:https://www.cnblogs.com/dmc-nero/p/9573971.html

jna 使用_使用JNA的透明JFrame

jna 使用在使JFrame透明中&#xff0c;我展示了一种使用AWTUtilities类使框架透明的方法。 但是使用该类会导致访问限制编译时错误&#xff0c;该文章中还显示了Eclipse中的解析。 现在&#xff0c;这里是使用Java本机的版本。 我使用Java本机访问&#xff08;JNA&#xff09;库…

通过命令查看linux 密码,linux查看用户密码(linux查看用户密码命令)

linux查看用户密码(linux查看用户密码命令)2020-05-15 13:18:30共10个回答1、用户名和密码的存储位置存储帐号的文件:/etc/passwd存储密码的文件:/etc/shadow2、可以使用cat、more、head、tail以及vim等命令查看或者修改,如下图所示:比如要查找系统中admin普通用户的密码,则执行…

命名规范参考

转载于:https://www.cnblogs.com/jy13638593346/p/9575481.html

Guavate:桥接Guava和Java8的微型库

Java8很棒&#xff0c;并向JDK添加了一些有用的抽象&#xff0c;这些抽象通过Google出色的Guava commons库在Java社区中得到了普及。 小组讨论表明&#xff0c; 不久将有一个需要Java 8的Guava版本&#xff0c;从而弥合了Guava和Java8之间的鸿沟。 但是&#xff0c;直到这样的时…

常见的几种异常类型-熟记

今天把几个常见的异常总结一下&#xff0c;希望自己能熟记&#xff0c;别忘记&#xff01;&#xff01;&#xff01; 1.NullPointerException: 空指针异常。经验发现这个异常是经常会发生的&#xff0c;属于运行时异常。 举例&#xff1a; public static void main(String[] ar…

linux不重启更新内核,编译并使用kpath不重启更新linux-kernel

yum install ncurses-devel -ytar -xvf linux-4.9.3.tar.xzcd linux-4.9.3/make menuconfigmake allmake modules_installmake installKpatch主要有四个组件。kpatch-build 产生hot patch。 通过对比包含patch和不包含patch的kernel差异&#xff0c;产生…

The type sun.management.ManagementFactory is not visible

Eclipse默认将这些受访问限制的API设成了Error。 解决方法&#xff1a; 只要将Windows---Preferences---Java--Complicer---Errors/Warings里面的Deprecated and restricted API中的Forbidden references(access rules) 选为Waring就可以编译过了 今天在JDK1.7中引入sun.manage…

简单选项卡

简单选项卡 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Document</title><style>#div1 {width: 350px;margin: 0 auto;}#div1 button{width: 100px; height: 30px; background-color: …

探索应用程序的指路明灯:Route 和 Router 入门指南(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Linux密码是一个回文,usermod命令和用户密码管理

3.4 usermod命令3.5 用户密码管理3.6 mkpasswd命令3.4 usermod命令在某些情况下需要改变现的用户的属性&#xff0c;改变用户的home目录、登录名、密码、登录shell&#xff0c;截止日期等&#xff0c;在这种情况下“usermod命令被使用。实例如下&#xff1a;#格式如下&#xff…

php cdi_配置CDI对话的超时

php cdi在开发JSF应用程序时&#xff0c;CDI对话范围是一个很好的功能。 想象一下&#xff0c;您有大型数据表&#xff0c;需要很长时间才能加载。 由于高内存消耗&#xff0c;您通常不希望将加载的数据放置在会话作用域的Bean中。 而且&#xff0c;您不能将加载的数据放在视图…

org.apache.jasper.JasperException: An exception occurred processing JSP page /admin/jiaoshi/daochuEx

org.apache.jasper.JasperException: An exception occurred processing JSP page /admin/jiaoshi/daochuExc.jsp at line 163这两句话表示创建一个新的文件失败。所以可能是当前用户没有文件路径的访问权限&#xff0c;也有可能是文件路径错误等其他关于文件路径的问题

解决在html中引入font-awesome的css文件后, 图标显示不出来

今天小颖在做项目时&#xff0c;需要在html文件中引入font-awesome.min.css&#xff0c;但是引入后&#xff1a; 以前小颖在用font-awesome库里的图标时&#xff0c;都是直接从node中下包&#xff0c;然后在main.js中引入得即可&#xff0c;第一次直接在html中直接引入css文件&…

linux 提供多用户telnet,linux系统telnet命令怎么用

2016-10-24 回答telnet命令通常用来远程登录。telnet程序是基于telnet协议的远程登录客户端程序。telnet协议是tcp/ip协议族中的一员&#xff0c;是internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的 能力。在终端使用者的电脑上使用…