[英]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.