关于stat函数的问题

C、C++和Java语言
回复
Debian大法好
帖子: 5
注册时间: 2019-07-03 9:08
送出感谢: 1 次
接收感谢: 0

关于stat函数的问题

#1

帖子 Debian大法好 » 2019-07-03 9:28

stat函数用来获取文件信息。
struct stat类型中 有一项是 st_mode,用来检测文件类型和文件权限信息。
用man查阅手册后,找到了如下掩码

S_IRWXU 00700 owner has read, write, and execute permission
S_IRUSR 00400 owner has read permission
S_IWUSR 00200 owner has write permission
S_IXUSR 00100 owner has execute permission

S_IRWXG 00070 group has read, write, and execute permission
S_IRGRP 00040 group has read permission
S_IWGRP 00020 group has write permission
S_IXGRP 00010 group has execute permission

S_IRWXO 00007 others (not in group) have read, write, and execute permission
S_IROTH 00004 others have read permission
S_IWOTH 00002 others have write permission
S_IXOTH 00001 others have execute permission
举个例子,比如这样:
stat(文件名,buf);
if( buf->st_mode & S_IRUSE)
printf("user can read it");
就可以检测属主是否有读取的权限。

我的问题在于 S_IRWXU S_IRWXG S_IRWXO这三个掩码
7用二进制表示就是 111
而111 和100,010,001做与运算,结果都是大于0 的
也就是说,即使其他人只有文件的读取权限
if(buf->st_mode &S_IRWXO)
printf("其他人可读,写,执行"):
这个if后表达式结果依然是“真”
但其他人并没有写入和执行的权限。

是我的用法出错了吗?
头像
astolia
论坛版主
帖子: 4007
注册时间: 2008-09-18 13:11
送出感谢: 1 次
接收感谢: 661 次

Re: 关于stat函数的问题

#2

帖子 astolia » 2019-07-03 20:05

当然是你的用法错了。想要同时检测多位,你该写成 if((buf->st_mode & S_IRWXO) == S_IRWXO)
这些用户感谢了作者 astolia 于这个帖子:
Debian大法好 (2019-07-03 20:12)
评价: 3.7%
Debian大法好
帖子: 5
注册时间: 2019-07-03 9:08
送出感谢: 1 次
接收感谢: 0

Re: 关于stat函数的问题

#3

帖子 Debian大法好 » 2019-07-04 8:34

astolia 写了:
2019-07-03 20:05
当然是你的用法错了。想要同时检测多位,你该写成 if((buf->st_mode & S_IRWXO) == S_IRWXO)
谢谢
回复

回到 “C/C++/Java”