readdir()挂在特定文件上

时间:2019-07-11 18:06:49

标签: c readdir

我是一名开始使用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);
}

0 个答案:

没有答案