前面我们初步认识了stat这个函数,并用它学会了查看文件的大小:linux 用stat 函数来查看文件大小;
现在我们来再看看stat 结构体中的 st_mode 成员,st_mode 其实是2byte的16bit的数,下面是用八进制表示的st_mode ,总共包含了下面这些情况:
S_IFMT 0170000 掩码
S_IFSOCK 0140000 套接字
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_IRWXU) 00700 的掩码;
S_IRGRP 00040 用户组具可读取权限
S_IWGRP 00020 用户组具可写入权限
S_IXGRP 00010 用户组具可执行权限
上面这三个用 (S_IRWXG) 00070 的掩码;
S_IROTH 00004 其他用户具可读取权限
S_IWOTH 00002 其他用户具可写入权限
S_IXOTH 00001 其他用户具可执行权限
上面这三个用 (S_IRWXO) 00007 的掩码;
下面我们来举两个例子,看如何使用:
我们可以用如下的语句来判断文件类型:
if((s.st_mode & S_IFMT) == S_IFREG )//则说明这个文件 s 的文件类型是普通文件
我们可以用如下的语句来判断文件所有者是否具有可执行权限:
if(s.st_mode & S_IXUSR)//则说明这个文件 s 的所有者有可执行权限
我们接着写一个测试用例:
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<sys/types.h>
4 #include<unistd.h>
5 #include<sys/stat.h>
6 #include<string.h>
7
8 int main(){
9 struct stat st;
10 int ret = stat("test.c",&st);
11 if(ret == -1){
12 perror("stat error");
13 exit(1);
14 }
15
16 printf("file size == %d\n",(int)st.st_size);
17 //判断文件类型是不是普通文件
18 if((st.st_mode & S_IFMT) == S_IFREG ){
19 printf("这是一个普通文件\n");
20 }
21 if(st.st_mode & S_IRUSR){
22 printf(" r\n");
23 }
24 if(st.st_mode & S_IWUSR){
25 printf(" w\n");
26 }
27 if(st.st_mode & S_IXUSR){
28 printf(" x\n");
29 }
30 return 0;
31 }
编译运行后:
不多说,自行体会。