簡體   English   中英

用兩個子進程在我自己的外殼中實現管道

[英]Implementing pipe in my own shell with two child process

我正在編寫自己的shell。 下面是它的一部分。 我想用兩個子進程來實現管道。 但是,當我執行以下代碼時,某些命令有效,而有些則無效。 排序”,“ ls | 排序”工作,但“會” 排序”,“貓文件| 排序”使我的外殼停止運行。 我必須'cntrl + c'逃脫我的外殼。 我不明白為什么有些命令可以工作而有些卻不能。 請有人指出我所缺少的是什么?

int pipefd[2];
int pipePos = checkPipePos(argc, argv); //find '|' command position in argv

if (pipe(pipefd) == -1) {
        printf("Creating pipe failed\n");
        return;
    }

    if (fork() == 0) {
        close(pipefd[0]);
        dup2(pipefd[1], 1);
        execlp(argv[0], argv[0], NULL);
    }

    if (fork() == 0) {
        close(pipefd[1]);
        dup2(pipefd[0], 0);
        execlp(argv[pipePos + 1], argv[pipePos + 1], NULL);
    }

    close(pipefd[0]);
    close(pipefd[1]);

    while (wait(NULL) >= 0);

我在這里看到一個可能的問題,它可能會也可能不會解釋不確定的結果。

在子進程中,復制管道的文件描述符之一后,您不會關閉原始文件描述符。

dup2(oldfd, newfd)oldfd復制到newfd ,但oldfd仍處於打開狀態。 現在, oldfdnewfd文件描述符都指向同一文件。 請參見dup2手冊頁。

通常,在dup2()-文件描述符之后,您需要關閉() oldfd

因此,這里要發生的是,一個子進程在stdout上將具有相同的文件描述符,而在其他隨機文件描述符上將具有相同的文件描述符,而另一個子進程在stdin上將具有相同的情況。

這可能會或可能不會導致問題,具體取決於子進程的作用。 不能肯定地說,但是您一定要解決此問題,看看是否有幫助。

您的管道邏輯是正確的。

ll | sort ll | sort不起作用,因為ll不是可執行文件。

cat file | sort cat file | sort不起作用,因為您沒有傳遞file參數。

Sam Varshavchik的改進是有效的。 這是一個很好的解決方法,但不會造成任何嚴重的問題。 造成的全部浪費是浪費了一個文件描述符插槽。

暫無
暫無

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

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