【发布时间】:2019-03-26 01:41:47
【问题描述】:
我试图通过遍历 C 中的目录来更好地理解 fork 进程的概念。
我的功能没有按预期工作:我的一些目录和文件被多次访问。
我应该从当前工作目录开始并列出所有文件/文件夹。每次找到子目录时,我都应该调用 fork() 并执行相同的操作,直到我用尽了每个文件/目录。我不需要按任何特定顺序访问这些项目,但我确实需要对每个项目都进行一次访问。
我让程序在没有使用 fork() 的情况下递归地工作。但我不能用 fork() 完全正确。这是功能。它只是通过字符串“.”,在当前工作目录启动它。
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();
forkCount++;
char pathBuffer[1024];
if (PID == 0)
{
snprintf(pathBuffer, sizeof(pathBuffer), "%s/%s", directory, currentDir->d_name);
traverse(pathBuffer);
}
else
{
listOfPIDS[forkCount] = PID;
int status = 0;
wait(&status);
}
}
else if (strcmp(currentDir->d_name, ".") != 0 && strcmp(currentDir->d_name, "..") != 0)
{
printf("%s\n", currentDir->d_name);
}
}
closedir(traverser);
return 0;
}
【问题讨论】:
-
在
if (PID == 0)之后,孩子将调用traverse,当traverse返回时,孩子将继续while循环。在等待孩子之后,父母还将继续while循环。所以我希望第一个子目录将被访问一次,第二个子目录将被访问两次,依此类推。 -
谢谢!您的观察帮助我找到了解决方案。