【问题标题】:Using wait() vs waitpid() in c在 c 中使用 wait() 与 waitpid()
【发布时间】:2018-10-11 02:37:52
【问题描述】:

所以我试图遍历一个目录(和子目录)并创建新进程来对文件进行排序和遍历子目录。但是,我在理解我的代码会有多大用处时遇到了一些麻烦。据我了解, wait() 将使父进程休眠,直到子进程终止。目前我的递归函数是

void iterate_dir(char* name){

    DIR *dd = opendir(name);
    struct dirent *curr;

    while((curr = readdir(dd))!=NULL){

        if((strcmp(curr->d_name,".")==0 || strcmp(curr->d_name,"..")==0) && curr->d_type==DT_DIR){

            continue;

        }

        int status = -1;
        int pid = fork();

        if(pid==0){

            //child process
            if(curr->d_type==DT_DIR){

                printf("DIRECTORY:\t%s\n", curr->d_name);
                char new_path[strlen(curr->d_name)+strlen(name)+2];
                sprintf(new_path,"%s/%s",name,curr->d_name);
                //recurse, iterate sub directory
                iterate_dir(new_path);
                _exit(getpid());


            }else{

                printf("FILE:\t%s\n", curr->d_name);
                //sort the file
                _exit(getpid());

            }


        }

        wait(&status);

    }

    closedir(dd);

}

给定初始目录,它可以工作,但我关心的是 wait() 函数。我希望代码在子进程执行时继续遍历目录,并且当前等待防止这种情况发生。但我仍然需要防止僵尸孩子。将使用 waitpid() 来代替允许我拥有此功能(即,允许循环在子进程执行时继续通过目录的其余部分),我可以只在 main 中使用 1 等待,这将防止所有创建的进程成为僵尸,还是我应该采取不同的方法?这是一个学校项目,我需要使用 fork(而不是 exec)来创建一个用于遍历子目录的新进程和一个用于对每个文件进行排序的新进程。

【问题讨论】:

    标签: c fork wait child-process waitpid


    【解决方案1】:

    不,更改为waitpid() 不会解决问题,因为它仍然会暂停循环,直到孩子退出。

    wait()从主循环中取出并在最后执行:

    while (wait() > 0) {
    }
    

    wait() 将等待任何子进程,如果没有子进程等待则返回 -1

    【讨论】:

      【解决方案2】:

      要使该代码真正有用,每次只能运行一个进程,否则几个同时运行的进程的输出将混合在标准输出中。

      所以 wait() 是一个不错的选择,因为您希望每个进程在启动新的子进程或结束其执行之前等待子进程结束。

      在不同的情况下,您希望同时运行不同的子进程,您可以使用waitpid(-1, &status, WNOHANG),这将(不)等待子进程结束,即如果没有子进程,它不会挂起已完成,但它会阻止任何已完成的子进程成为僵尸。

      【讨论】:

        猜你喜欢
        • 2017-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-18
        • 1970-01-01
        • 2017-10-12
        相关资源
        最近更新 更多