在linux中列出目录时无限递归

chr*_*ris 2 c linux filesystems recursion

我尝试编写程序,其中部分列出所有目录(特别是从/开始),但我有一个问题/ proc/self无限递归(我得/ proc/self/task/4300/fd/3/proc/self/task/4300/fd/3/proc/self/task/4300/fd/3/proc/...等等).处理它的好方法是什么?

编辑:程序是用C语言编写的,我使用的是opendir(),readdir()

Dav*_*235 6

您可以使用S_ISLNK宏来测试对lstat的调用返回的st_mode字段.如果文件是符号链接,请不要尝试遵循它.

[user@machine:~]:./list | grep link
/proc/mounts is a symbolic link
/proc/self is a symbolic link
Run Code Online (Sandbox Code Playgroud)

示例代码

#include <stdio.h>     // For perror
#include <stdlib.h>
#include <sys/types.h> // For stat, opendir, readdir
#include <sys/stat.h>  // For stat
#include <unistd.h>    // For stat
#include <dirent.h>    // For opendir, readdir

const char *prefix = "/proc";

int main(void)
{
    DIR *dir;
    struct dirent *entry;
    int result;
    struct stat status;
    char path[PATH_MAX];

    dir = opendir(prefix);
    if (!dir)
    {
        perror("opendir");
        exit(1);
    }

    entry = readdir(dir);
    while (entry)
    {
        result = snprintf(path, sizeof(path), "%s", prefix);
        snprintf(&path[result], sizeof(path) - result, "/%s", entry->d_name);
        printf("%s", path);

        result = lstat(path, &status);
        if (-1 == result)
        {
            printf("\n");
            perror("stat");
            exit(2);
        }

        if (S_ISLNK(status.st_mode))
        {
            printf("%s", " is a symbolic link");
        }

        printf("\n");

        entry = readdir(dir);
    }

    return(0);
}
Run Code Online (Sandbox Code Playgroud)