我是一名开始使用C语言的C程序员,他编写一个程序,该程序将接受从命令行获取的给定目录位置,然后打印有关目录中每个文件/目录的摘要信息(以下代码)。在其中,我将当前目录的绝对路径连接到目录内文件的名称,因为我希望扩展程序以处理很多常规情况。通常,该代码似乎可以在目录中带有或不带有最后一个“ /”的情况下工作。例如,它将花费:
directory1 / directory2
或:
目录1 /目录2 /
但是,它挂在特定文件上,或更确切地说,它在读取文件后挂在下一个readdir()调用上。在我测试过的所有文件中,只有一个文件。基本上,它将读取特定文件,打印出信息,然后挂在下一个readdir()调用上。它不会出错或引起故障。它就像正在等待命令一样停止。
我试用了它,发现对于该特定目录,仅当我将最后的'/'放到目录中时才会发生错误。如果我不这样做,则程序运行正常。如前所述,我测试过的任何其他目录都不是这种情况。
此外,我已经在其上运行gdb和strace。我很新,不知道如何解释它们给出的信息,但是当调用下一个readdir()时,它们都崩溃或挂起,就像程序本身一样。在gdb挂起时,我可以中断该过程,并且它给出如下所示:
__lll_lock_wait_private ()
at ../sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:95
95 in ../sysdeps/unix/sysv/linux/x86_64/lowlevellock.S
和strace在挂起然后崩溃之前给出了此信息:
futex(0x5623ad93e294, FUTEX_WAIT_PRIVATE, 2, NULL
下面是我正在使用的代码。任何想法都将非常有帮助。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>
struct stat buf;
int main(int argc, char **argv) {
char * r;
strcpy((r = (char *) malloc(strlen(argv[1]) + 1)), argv[1]);
DIR * ptr = opendir(r);
struct dirent * directory = readdir(ptr);
do {
strcat(r, (directory->d_name));
printf("%s\n", r);
stat(r, &buf);
printf("inode number: %ld\n", (directory->d_ino));
printf("offset: %ld\n", (directory->d_off));
printf("name: %s\n", (directory->d_name));
free(r);
r = NULL;
strcpy((r = (char *) malloc(strlen(argv[1]) + 1)), argv[1]);
directory = readdir(ptr);
} while (directory != NULL);
}