Итак, я пытаюсь перебрать каталог и его подкаталоги, распечатывая имена файлов и подкаталогов.Мне нужно использовать fork () для создания дочернего процесса для обработки печати имени файла или имени подкаталога.В настоящее время я использую рекурсивную функцию, повторяющуюся при обнаружении подкаталога;однако программа выводит дублирующую информацию.
void itterate_dir(DIR * dd){//given initial directory dd
struct dirent * curr = NULL;
curr = readdir(dd);//skip initial ./ and .. directories
curr = readdir(dd);
curr = readdir(dd);
while(curr!=NULL){
int status = 0;
int pid = fork();
if(pid==0){
//in child process
if(curr->d_type == DT_REG){//is a file
printf("File:\t%s\n", curr->d_name);
}else{//is a directory
printf("Directory:\t%s\n", curr->d_name);
DIR * dd = opendir(strcat(curr->d_name,"/"));
itterate_dir(dd);
closedir(dd);
}
}
wait(&status);
curr = readdir(dd);
}
}
Когда я вношу каталог, содержащий file1, file2, foo_stuff (подкаталог), файл 3, я получаю следующий вывод
File: f1
File: f2
Directory: more_foo
File: f3
Directory: more_foo
File: f3
File: f2
Directory: more_foo
File: f3
Directory: more_foo
File: f3
Кто-нибудь может объяснить, что здесь происходит?Есть ли лучший способ использовать fork (), чтобы сделать это без рекурсии?