Использование fork () для рекурсивного просмотра каталога в C - PullRequest
0 голосов
/ 09 октября 2018

Итак, я пытаюсь перебрать каталог и его подкаталоги, распечатывая имена файлов и подкаталогов.Мне нужно использовать 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 (), чтобы сделать это без рекурсии?

...