簡體   English   中英

C叉的標准輸出

[英]C pipe stdout to fork

我正在嘗試編寫一個執行ls | wc的C程序ls | wc ls | wc使用管道和叉子,但我無法弄清楚我的代碼出了什么問題。 當我運行下面的代碼時,什么也不會返回。

int main() {
    pid_t p1, p2;
    int fd1[2];

    pipe(fd1);

    p1 = fork();
    if (p1 == 0) {
        close(STDOUT_FILENO);
        dup2(fd1[1], STDOUT_FILENO);
        close(fd1[0]);
        execlp("ls", "ls", (char *)NULL);
    } else {
        p2 = fork();

        if (p2 == 0) {
            dup2(fd1[0], STDIN_FILENO);
            close(fd1[0]);
            close(fd1[1]);

            execlp("wc", "wc", (char *)NULL);
        } else {
            waitpid(p2, 0, WUNTRACED);
            waitpid(p1, 0, WUNTRACED);
        }
    }

    return 0;
}

您沒有明確解釋該程序在做什么,您認為這是錯誤的。 但是,當我自己運行此程序時(在添加了適當的標題后,以后,請不要將它們放在您的問題之外),它會掛起,直到按Control-C為止。 我會認為這是你不想要的東西,而且你希望的事情是它打印輸出wc ,然后退出。

程序掛起,因為fd1[1]在調用wait時仍在父進程中處於打開狀態。 在關閉所有引用管道寫端的文件描述符之前, wc不會收到EOF指示。 但是父進程在兩個子進程都退出之前不會關閉管道的寫操作,而wc在獲得EOF之前不會退出。因此,您將陷入僵局。

您需要在第一個if的第一個父級上添加close(fd1[1]) ,緊接在p2 = fork() 這足以消除僵局。 您還應該waitpid調用之前,在第二個 if的父級添加close(fd1[0]) 並且您還應該檢查所有操作是否有錯誤。

暫無
暫無

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

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