簡體   English   中英

Linux Fork進程終止

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM