我为项目创建了自己的ls命令,并使用" st_mode"变量以查找文件权限但我不使用宏。
例: st_mode = 16877
我将它转换为八进制基数:
st_mode = 40755
我保留了最后三个字符,然后获得了我的权限。
但是当我试图找到文件的类型时,我尝试使用两个第一个字符,但它们并没有真正帮助我...... 所以我想知道我是否可以使用前两个字符来查找文件的类型(链接,文件夹,...)。如果我不能用于查找文件的类型
感谢您的帮助。
答案 0 :(得分:1)
根据POSIX <sys/stat.h> documentation:
应提供以下宏来测试文件是否属于 指定的类型。提供给宏的值m是值 来自stat结构的st_mode。宏应评估为非零 如果测试为真,则为值;如果测试结果为假,则为0。
S_ISBLK(m) Test for a block special file. S_ISCHR(m) Test for a character special file. S_ISDIR(m) Test for a directory. S_ISFIFO(m) Test for a pipe or FIFO special file. S_ISREG(m) Test for a regular file. S_ISLNK(m) Test for a symbolic link. S_ISSOCK(m) Test for a socket.
答案 1 :(得分:0)
是的,您可以将这两种方法与预定义的宏一起使用,如下所示,打开stat()系统调用的手册页,它说
S_IFMT 0170000 bit mask for the file type bit fields
&
和st_mode
的{{1}}也是如此,您将获得文件类型
S_IFMT
如果您不想使用宏,请先找出 struct stat v;
stat(file,&v);
switch (v.st_mode & S_IFMT) // type of file
{
case S_IFBLK: printf("b"); break;
case S_IFCHR: printf("c"); break;
case S_IFDIR: printf("d"); break;
case S_IFIFO: printf("p"); break;
case S_IFLNK: printf("l"); break;
case S_IFREG: printf("-"); break;
case S_IFSOCK: printf("s"); break;
default: printf("unknown?"); break;
}
&amp;的每种类型的st_mode
值。然后写出逻辑。例如,files
的{{1}}值为st_mode
,regular file
的最后3位数(664),写入10664的二进制文件,您将会知道10664
位设置为permission
。同样找到不同类型文件的st_mode值&amp;分析
15th
我希望它有所帮助。