[英]Linux Fork Process termination
//Executing shell command ls -l | sort
int *pipeIN, *pipeOUT;
int runLS(){
char* parmListLS[] = { "ls", "-l", NULL };
int pid = fork();
if(pid==0){
close(*pipeIN);
dup2(*pipeOUT, STDOUT_FILENO);
execvp(parmListLS[0], parmListLS);
}else return pid;
}
int runSORT(){
char* parmListSORT[] = { "sort", NULL };
int pid = fork();
if(pid==0){
close(*pipeOUT);
dup2(*pipeIN, STDIN_FILENO);
execvp(parmListSORT[0], parmListSORT);
}else return pid;
}
int main(void){
int pidLS, pidSort, pipeId[2];
pipeIN = &pipeId[0], pipeOUT = &pipeId[1];
pipe(pipeId); //open pipes
pidLS = runLS();
pidSort = runSORT();
printf("PIDS: LS -> %d, Sort -> %d\n", pidLS, pidSort);
printf("Terminated: %d\n", wait(NULL)); //return pid of 1st exited proc
printf("Terminated: %d\n", wait(NULL)); //return pid of 2nd exited proc
printf("Terminated Main Proccess!\n");
}
你好! 我在使一些簡單的管道在Linux上工作時遇到麻煩。 我正在嘗試模擬shell命令ls-l | 分類。 如您所見,我正在初始化兩個子過程,一個用於ls -l,另一個用於排序。 這些過程獨立運行,我正在嘗試將ls-l的輸出重定向為通過管道進行排序的輸入。 概念是主程序應等待它們都終止。 但是,對於ls -l來說,wait似乎工作正常,但是掛起了-永遠不會終止排序。 因此,整個程序掛起。 如果我從程序中刪除了兩條等待代碼行,則ls-l-> sort管道可以完美運行,當然main在它們之前終止。 我懷疑這是由於這樣的事實,即使ls-l終止后,sort仍在等待輸入。 我不了解父級的終止如何影響兩個子進程的終止。 有人能對我解釋一下實際情況嗎? 非常感謝你。 PS。 為了清晰和減少代碼,我忽略了大多數錯誤檢查。
sort
無法終止,因為父進程仍然打開了管道的寫入端(和讀取端),因此sort
尚未達到管道上的EOF,因此它沒有獲取所有數據,因此不能寫任何輸出。
加:
close(pipeId[0]);
close(pipeID[1]);
在調用runLS()
和runSORT()
,一切按預期進行。
理想情況下,孩子們在剛復制完之后應該關閉管道的兩端。 如果你復制一個管道的文件描述符到標准文件流,你應該總是關閉管道的兩端 。 在此代碼中,您無需做就可以逃脫。 並非總是如此。
我個人認為這兩個全局變量沒有太大幫助。 例如,標記為pipeIn
的管道是要sort
的輸入,但是ls
的輸出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.