簡體   English   中英

執行讀取

[英]Execlp with read

我想實現一個使用 shell 命令從標准輸入讀取的程序,然后我必須存儲輸入並用它做其他事情。

        int a[2];
        if(pipe(a)==-1){
                err(1, "error while creating a pipe");
        }

        int fd=fork();
        if(fd<0){
                err(1, "error while forking");
        }

        if(fd==0){
                close(a[0]);
                dup2(a[1], 1);
                execlp("read", "read", NULL);
        }

        close(a[1]);
        dup2(a[0], 0);

它不需要輸入,我該如何解決?

read的是內置的 shell。 它只能作為 shell 命令運行,不能通過任何exec -family 函數直接啟動。 如果您檢查,您很可能會發現您的execlp()調用失敗(返回非零值),這對您來說是一個雙重問題:

  1. 失敗本身意味着你想做的工作實際上並沒有完成。 但是也

  2. execlp()返回之后,它只有在失敗時才會這樣做,子進程繼續執行僅適用於父進程的工作。

你應該經常檢查你的系統調用是否有錯誤,但對於exec -family 函數來說比大多數函數更重要。 一般來說,如果execlp或其同級之一失敗,您希望該進程在不久之后執行_exit(1)

通過execlp運行 shell 命令的正確方法是啟動 shell,通過-c參數指定要運行的命令。 看起來像這樣:

    execlp("/bin/sh", "sh", "-c", "read", (char *) NULL);

如果您願意,可以使用不同的 shell ( bashzsh)。

而且read消耗輸入並將其存儲在一個或多個 shell 變量中。 它不會產生 output,所以我不確定您希望如何確定它是否讀取任何內容。

暫無
暫無

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

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