char *m = "xwr"; for (i = 8; i >= 0; i--) { if (st.st_mode & 1 << i) { printf("%c", m[i % 3]); } else { printf("-"); } }
时间: 2024-02-14 14:24:12 浏览: 61
这是一段 C 语言代码,它的作用是将一个文件的权限信息以特定格式打印出来。具体来说,它使用了 Linux 系统中的 stat 函数获取文件的状态信息,其中包括了文件的权限信息。然后,它将每个权限位(一共有 9 个,分别表示文件的读、写、执行权限)转换成一个字符,如果该权限位存在则输出字符 m[i%3],否则输出“-”。其中,m 是一个字符指针,指向字符串 "xwr",表示三种权限对应的字符。循环中的 i 从 8 开始递减,是因为在 Linux 系统中,每个文件的权限信息用一个 9 位二进制数表示,最高位表示文件类型,因此从第 8 位开始才是文件的实际权限位。
相关问题
include "head.h" int main(int argc, char *argv[]) { if (argc != 2) { printf("%s<dirname>\n", argv[0]); return -1; } struct dirent *dt; struct stat st; struct tm *tp; struct passwd *pd; struct group *gd; char pathname[300]; DIR *dir = opendir(argv[1]); while((dt= readdir(dir))!=NULL) { if (!strcmp(dt->d_name, ".") || !strcmp(dt->d_name, "..")) { continue; } memset(&stat, 0, sizeof(stat)); snprintf(pathname, strlen(argv[1]) + strlen(dt->d_name) + 2, "%s%s", argv[1], dt->d_name); if (lstat(pathname, &st) < 0) { perror("lstat"); return -1; } // 权限 if (S_ISREG(st.st_mode)) printf("-"); else if (S_ISDIR(st.st_mode)) printf("d"); else if (S_ISCHR(st.st_mode)) printf("c"); else if (S_ISBLK(st.st_mode)) printf("b"); else if (S_ISFIFO(st.st_mode)) printf("p"); else if (S_ISLNK(st.st_mode)) printf("l"); else if (S_ISSOCK(st.st_mode)) printf("s"); printf("111111111111111111111111\n"); int i; char *m = "xwr"; for (i = 8; i >= 0; i--) { if (st.st_mode & 1 << i) { printf("%c", m[i % 3]); } else { printf("-"); } } printf(" "); tp = localtime(&st.st_ctime); printf("%lu %s %s %ld", st.st_nlink, pd->pw_name, gd->gr_name, st.st_size); printf(" "); printf("%d月 ", tp->tm_mon + 1); printf("%d ", tp->tm_mday); printf("%d:%d ", tp->tm_hour, tp->tm_min); printf("%s ", pathname); } closedir(dir); return 0; }
这段代码是一个 C 语言程序,用于实现一个简单的 ls 命令。它通过读取指定目录下的所有文件和子目录,并输出它们的文件类型、权限、大小、创建时间和名称等信息。其中使用了 POSIX 标准库中的 dirent.h、stat.h、time.h、pwd.h 和 grp.h 等头文件,以及相关的数据结构和函数。如果运行该程序时没有指定目录名,则会输出使用说明并返回错误码。
阅读全文