簡體   English   中英

子進程之間的UNIX管道

[英]UNIX Pipes Between Child Processes

我正在嘗試編寫一個程序,它將在它們之間產生任意數量的子進程和管道,類似於命令行管道。 在我的情況下,我正在嘗試“ls -l | more”並將其輸出到stdout,然后讓父級繼續執行更多命令。

我將以下代碼作為最小示例:

int main (int argc, const char * argv[]) {
    int fd[2];
    pipe(fd); 
    chdir("/directory/with/lots/of/files");

    // Create one child process for more
    int pid = fork();
    if (pid == 0) {
        close(fd[1]);
        int ret = dup2(fd[0],0);
        if (ret < 0) perror("dup2");
        char *argv[10];
        argv[0] = "more";  argv[1] = NULL;
        execvp("more", argv);
    } 
    // Create another child process for ls
    int pid2 = fork();
    if (pid2 == 0) {
        int ret = dup2(fd[1],1);
        if (ret < 0) perror("dup2");
        char *argv[10];
        argv[0] = "ls";    argv[1] = "-l";   
        argv[2] = NULL;
        execvp("ls", argv);
    }

    // wait for the more process to finish
    int status;
    waitpid(pid, &status, 0);

    printf("Done!\n");
    return 0;
}

現在,當我執行程序時(當然包含在main()函數中)我最終得到的更多,這是預期的。 我會點擊“d”來減少更多的輸出和“你”上升,它似乎工作正常。 但是當我到達底部,而不是像更多的那樣退出時,它只留下一個空白。 Ctrl-C用於退出它,但退出整個程序,意味着“完成!” 線從未打印過。 這里有一部電影可以說明會發生什么(請注意,最后我按Ctrl-C返回bash)。

有什么想法嗎? 我只想弄清楚如何將其更改為位置,而不是在更多到達底部之后轉到空行,更多退出並返回到父進程,以便它可以繼續執行。

您需要至少close()管道的寫入端,否則more將永遠不會看到EOF。 例如:

    ...

    // close parent's pipes
    close(fd[0]);
    close(fd[1]);

    // wait for the more process to finish
    int status;
    waitpid(pid, &status, 0);

    printf("Done!\n");
    return 0;
}

我認為這是因為wait() function 遵循邏輯,您的第二個子進程輸出到第一個子進程,這意味着它應該首先結束而不是第二個子進程。

wait功能中,您正在等待第一個進程結束,但您不是在等待第二個進程。 這意味着如果第二個進程沒有向輸出發送EOF,我猜你的第一個進程將不會結束。

您可以嘗試等待第二個進程而不是第一個進程,並查明是否存在問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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