c - 如何使用 C 迭代目录并在特定级别停止?

标签 c process directory

我正在尝试在终端中打印当前系统中所有进程的名称。为此,我必须进入“proc”目录中以进程 ID 命名的所有目录。因此,我循环直到“acpi”目录之前,并尝试读取每个进程目录中的状态文件。但我不完全了解如何读取目录内目录中的文件。在运行下面的代码时:

#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <dirent.h>

int main(int argc, const char *argv[])
{

DIR* FD;
struct dirent* in_file;
FILE  *process_file;
char ch, pname[1024];
int i=0;

FD = opendir ("/proc");

while ((in_file = readdir(FD))) 
{
    if (strcmp (in_file->d_name, "acpi") == 0)
        break;

    else 
    {
        opendir(in_file->d_name);

        process_file = fopen("status", "r");

        while( ( ch = fgetc(process_file) ) != '\n' )
        {
            pname[i] = ch;
            i++;
        } 
        printf(" %s \n",pname);
        fclose(process_file);


        closedir(in_file->d_name);
    }

}

closedir(FD);
return 0;

}

我收到错误:

myps.c: In function ‘main’:
myps.c:38:13: warning: passing argument 1 of ‘closedir’ from incompatible pointer type
    closedir(in_file->d_name);
             ^
In file included from myps.c:5:0:
/usr/include/dirent.h:149:12: note: expected ‘struct DIR *’ but argument is of type ‘char *’
 extern int closedir (DIR *__dirp) __nonnull ((1));
            ^

最佳答案

这是何时使用递归函数的一个很好的示例。

该函数将获取目录名称,打开该目录,然后循环显示结果。对于不是 ... 的每个结果,调用 stat 函数来获取每个条目的状态。然后针对文件模式使用 S_ISREGS_ISDIR 宏来查看它是常规文件还是目录。如果它是一个目录,则从父目录和您刚刚找到的目录构建一个新字符串,并将其传递给递归函数调用。

所以这个函数看起来像这样:

void processDirectory(char dirname[])
{
    struct stat statbuf;
    DIR *dir;
    struct dirent *de;
    char *subdirname;
    int rval, ;

    if ((dir = opendir(dirname)) == NULL) {
        perror("Failed to open directory %s", dirname);
        exit(1);
    }
    while ((errno = 0, de = readdir(dir)) != NULL) {
        rval = stat(de->d_name, &statbuf);
        if (rval == -1) {
            perror("stat failed"); 
            exit(1);
        }

        if (S_ISREG(statbuf.st_mode)) {
            // process as a regular file
        } else if (S_ISDIR(statbuf.st_mode)) {
            if (strcmp(de->d_name, ".") && strcmp(de->d_name, "..")) {
                subdirname = malloc(strlen(dirname) + strlen(de->d_name) + 2);
                if (subdirname == NULL) {
                    perror("malloc failed");
                    exit(1);
                }
                strcpy(subdirname, dirname);
                strcat(subdirname, "/");
                strcat(subdirname, de->d_name);
                processDirectory(subdirname);
                free(subdirname);
            }
        }
    }
    if (errno && (errno != ENOENT)) {
        perror("Failed to read directory %s", dirname);
        exit(1);
    }
    closedir(dir);

}

关于c - 如何使用 C 迭代目录并在特定级别停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31816596/

相关文章:

c - 当收到第一个数据报时,recvfrom() 不填充结构 `sockaddr`

linux - 如何在 Linux 中从 OS Process Sampler 执行 jar

c - 为什么父进程在处理信号后没有返回到确切的位置?

logging - Equinox 独立日志文件夹

c++ - 使用 C++ 获取目录根目录

c - 如何在 c 中存储 pow(10,n) 整数值,其中 n 可以 <200?

c - 如何正确链接 KBuild Makefile 以在内核模块中构建子文件夹

C文件无法编译

linux - 如何防止在 Linux 中关闭 SSH 客户端后停止后台进程

linux - 将新文件夹移动到根目录