【发布时间】:2022-01-18 16:09:25
【问题描述】:
我正在尝试用它的一些标志重写 ls 函数,目前我正在实现 [-l] 标志,但是关于原始 ls 和 lstat 权限的输出是不同的
这是我的代码
void mx_strmode(mode_t mode, char * buf) {
const char chars[] = "rwxrwxrwx";
for (size_t i = 0; i < 9; i++) {
buf[i] = (mode & (1 << (8-i))) ? chars[i] : '-';
}
buf[9] = '\0';
}
int main(int ac, char **av) {
t_flags flags = mx_get_flags(ac, av);
char *dir_name = get_dir_name(ac, av);
DIR *dir;
struct dirent *entry;
dir = opendir(dir_name);
if (!dir) {
perror("diropen");
exit(1);
};
struct stat s_stat;
while ((entry = readdir(dir)) != NULL) {
lstat(entry->d_name, &s_stat);
char buf_perm[10];
mx_strmode(s_stat.st_mode, buf_perm);
printf("%s %s\n", buf_perm , entry->d_name);
};
closedir(dir);
}
这是我从 ls 和我的程序中得到的。我正在打开不包含我的可执行文件的目录(可能是问题的根源)
>drwxr-xr-x 3 fstaryk 4242 102 Jan 3 17:27 .
>drwxr-xr-x 11 fstaryk 4242 374 Jan 18 17:40 ..
>-rw-r--r-- 1 fstaryk 4242 4365 Jan 18 17:40 main.c
>rwxr-xr-x .
>rwx------ ..
>rwx------ main.c
【问题讨论】:
-
检查
lstat的返回值(以及您可能未检查的任何其他库调用) -
@Mat ,lstat 实际上在 main.c 上返回 -1 但我不知道为什么,“..”的信息仍然不正确
-
打印出
dentry->d_name(也许是当前目录以使其更清晰)。 -
@Mat 通过 perror 输出是 >lstat: No such file or directory NAME IS main.c
标签: c file unix permissions