【发布时间】:2016-02-28 00:07:46
【问题描述】:
我正在尝试用 C 编写 ls 命令,但 stat() 拒绝打开任何其他目录。
~/Desktop/ls$ cat bug.c
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <unistd.h>
int main(int ac, char **av)
{
DIR *d;
struct dirent *dir;
struct stat file;
d = opendir(av[1]);
if (d)
{
while ((dir = readdir(d)) != NULL)
{
printf("%s ->", dir->d_name);
if (lstat(dir->d_name, &file) < 0)
printf(" can't read file %s!", dir->d_name);
printf("\n");
}
}
closedir(d);
return (0);
}
运行 ./a.out 时。或任何子文件夹,它可以正常工作。
但是如果我写 ./a.out .. ,则无法打开文件...
~/Desktop/ls$ ./a.out ..
.. ->
fkdkfdjkfdkfjdfkdfjkdfjkdjkfdkjf -> can't read file fkdkfdjkfdkfjdfkdfjkdfjkdjkfdkjf!
ss -> can't read file ss!
ls -> can't read file ls!
. ->
tg -> can't read file tg!
./a.out /home/login/Desktop 也不起作用,但./a.out /home/login/Desktop/ls/ 可以正确显示当前文件夹的内容。
看起来a.out 无法打开父母目录,但ls -l 给出了:
-rwxrwxr-x 1 hellomynameis hellomynameis 13360 nov. 25 09:56 a.out
我做错了吗?
谢谢!
【问题讨论】:
-
我在“ls”输出中看不到“fkdkfdjkfdkfjdfkdfjkdfjkdjkfdkjf”。 stat() 无法报告它找不到的文件。您的意思是在 '../fkdkfdjkfdkfjdfkdfjkdfjkdjkfdkjf' 上运行 stat 吗?
-
关于
stat(), 1) 必须传递完整(可以是相对或绝对)路径,即使当前目录也应引用为./2) 目录/文件必须具有当前正在执行的程序读取目录/文件的适当权限。这包括“路径”参数中的任何/所有目录 -
贴出的代码编译不干净!编译时始终启用所有警告,然后修复这些警告。 (对于 gcc,至少使用:
-Wall -Wextra -pedantic) -
访问 argv[0] 以外的任何 argv[] 条目时,始终检查 argc 的值以确保命令行参数确实存在。否则,如果使用实际上没有输入必要的命令行参数,则可能会访问 NULL 指针或内存中的某个随机值
-
发布的代码(可能)不想尝试打开目录条目
.和..,因此应检查目录名称以确保它不是这些值。 (一定要使用类似 strcmp() 的东西,这样就不会跳过以.开头的文件或目录名称