递归函数使用运行太多次的fork()遍历目录

时间:2018-10-22 02:13:57

标签: c recursion directory

我试图通过遍历C中的目录来更好地理解派生进程的概念。

我的功能无法正常运行:我的某些目录和文件已被多次访问。

我应该从当前工作目录开始并列出所有文件/文件夹。每次找到子目录时,我都应该调用fork()并执行相同的操作,直到用尽每个文件/目录为止。我不需要按任何特定顺序来访问这些项目,但是我确实需要一次访问每个项目。

我无需使用fork()就可以递归地运行程序。但是我用fork()不太正确。这是功能。它只是传递了字符串“。”,以在当前工作目录中启动它。

object_pairs_hook

1 个答案:

答案 0 :(得分:1)

考虑到其他用户的评论并进行了更多尝试之后,我想到了此解决方案。通过在子进程递归调用函数后中断while()循环,不会重新访问相同的文件夹/文件。正如其他用户在其注释中指出的那样,当父级调用fork并开始等待时,子级开始并再次递归调用该函数。子级的递归调用完成后,它将返回到目录中完全相同的位置,并开始列出所有文件。完成后,父级等待完成,然后返回完全相同的位置并开始列出文件。因此,父级和子级都将返回目录和列表文件中的同一位置。在孩子的递归调用完成执行后,只需添加exit(0);即可解决问题。另外,我将pathBuffer[]forkCount++移到了子进程的部分,因为父级不必担心。

代码如下:

int traverse(char* directory)
{
    struct dirent *currentDir;  
    DIR *traverser = opendir(directory);

    if (traverser == NULL)
    {
        printf("Error: Could not open directory.\n");
        return 0;
    }

    while ((currentDir = readdir(traverser)) != NULL)
    {       
        if (currentDir->d_type == DT_DIR && strcmp(currentDir->d_name, ".") != 0 && strcmp(currentDir->d_name, "..") != 0)
        {
            int PID = fork();

            if (PID == 0)
            {
                forkCount++;        
                char pathBuffer[1024];
                snprintf(pathBuffer, sizeof(pathBuffer), "%s/%s", directory, currentDir->d_name);
                traverse(pathBuffer);
                exit(0);
            }
            else
            {
                listOfPIDS[forkCount] = PID;
                int status = 0;
                wait(&status); //wait at end
            }
        }
        else if (strcmp(currentDir->d_name, ".") != 0 && strcmp(currentDir->d_name, "..") != 0)
        {
            printf("%s: Proc'd by %d\n", currentDir->d_name, getpid());
        }
    }

    closedir(traverser);
    return 0;
}