在Linux中,我们如何判断一个文件的类型和用户权限呢?
在c语言中,Linux为我们提供了一个结构体stat我们可以通过 #include<sys/stat.h>引入后使用。然后通过stat中的st_mode来判断文件的类型。如下图,我们要知道文件是什么类型的话。我们只需要获取没个文件对应的stat结构题,获取方式:lstat(argv[i], &st) st就是声明的结构体。argv[i]就是传入的第i+1个参数,即文件名字。
如何获取文件类型呢,我们只需要让文件对应的stat结构体与S_IFMT相与后得到的结构和对应的文件掩码相判断就行。代码和运行时的参数和结果如下。
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
struct stat st;
for (int i = 1; i < argc; ++i) {
printf("%s\n", argv[i]);
if (lstat(argv[i], &st) < 0) {
printf("not a file\n");
continue;
}
if ((S_IFMT & st.st_mode)==S_IFBLK) {
printf("is block file\n");
}
if ((S_IFMT & st.st_mode)) {
printf("is char file\n");
}
if ((S_IFMT & st.st_mode)==S_IFDIR) {
printf("is dir file\n");
}
if ((S_IFMT & st.st_mode)==S_IFIFO) {
printf("is fifo file\n");
}
if ((S_IFMT & st.st_mode)==S_IFLNK) {
printf("is link file\n");
}
if ((S_IFMT & st.st_mode)==S_IFREG) {
printf("is rge file\n");
}
if ((S_IFMT & st.st_mode)==S_IFSOCK) {
printf("is socket file\n");
}
}
}
S_IFMT | 1111 0000 0000 0000 | 文件类型的位遮罩 |
S_IFSOCK | 1100 0000 0000 0000 | scoket |
S_IFSOCK | 1010 0000 0000 0000 | 符号连接 |
S_IFREG | 1000 0000 0000 0000 | 一般文件 |
S_IFBLK | 0110 0000 0000 0000 | 区块装置 |
S_IFDIR | 0100 0000 0000 0000 | 目录 |
S_IFCHR | 0010 0000 0000 0000 | 字符装置 |
S_IFIFO | 0001 0000 0000 0000 | 管道 |
S_ISUID | 0000 1000 0000 0000 | 文件的(set user-id on execution)位 |
S_ISGID | 0000 0100 0000 0000 | 文件的(set group-id on execution)位 |
S_ISVTX | 0000 0010 0000 0000 | 文件的sticky位 |
S_IRUSR | 0000 0001 0000 0000 | 文件所有者具可读取权限 |
S_IWUv | 0000 0000 1000 0000 | 文件所有者具可写入权限 |
S_IXUSR | 0000 0000 0100 0000 | 文件所有者具可执行权限 |
S_IRGRP | 0000 0000 0010 0000 | 用户组具可读取权限 |
S_IWGRP | 0000 0000 0001 0000 | 用户组具可写入权限 |
S_IXGRP | 0000 0000 0000 1000 | 用户组具可执行权限 |
S_IROTH | 0000 0000 0000 0100 | 其他用户具可读取权限 |
S_IWOTH | 0000 0000 0000 0010 | 其他用户具可写入权限 |
S_IXOTH | 0000 0000 0000 0001 | 其他用户具可执行权限 |