繁体   English   中英

在C中使用wait()vs waitpid()

[英]Using wait() vs waitpid() in c

因此,我试图遍历目录(和子目录)并创建新的过程来对文件进行排序并遍历子目录。 但是,我在理解我的代码的实用性方面遇到了一些麻烦。 据我了解,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个wait来防止创建的所有进程变成僵尸,还是我应该采取其他方法? 这是针对学校项目的,我需要使用fork(而不是exec)来创建用于遍历子目录的新过程以及用于对每个文件进行排序的新过程。

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

从主循环中取出wait()并在最后完成:

while (wait() > 0) {
}

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM