我试图通过遍历C中的目录来更好地理解派生进程的概念。
我的功能无法正常运行:我的某些目录和文件已被多次访问。
我应该从当前工作目录开始并列出所有文件/文件夹。每次找到子目录时,我都应该调用fork()并执行相同的操作,直到用尽每个文件/目录为止。我不需要按任何特定顺序来访问这些项目,但是我确实需要一次访问每个项目。
我无需使用fork()就可以递归地运行程序。但是我用fork()不太正确。这是功能。它只是传递了字符串“。”,以在当前工作目录中启动它。
object_pairs_hook
答案 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;
}