[英]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()
調用失敗(返回非零值),這對您來說是一個雙重問題:
失敗本身意味着你想做的工作實際上並沒有完成。 但是也
在execlp()
返回之后,它只有在失敗時才會這樣做,子進程繼續執行僅適用於父進程的工作。
你應該經常檢查你的系統調用是否有錯誤,但對於exec
-family 函數來說比大多數函數更重要。 一般來說,如果execlp
或其同級之一失敗,您希望該進程在不久之后執行_exit(1)
。
通過execlp
運行 shell 命令的正確方法是啟動 shell,通過-c
參數指定要運行的命令。 看起來像這樣:
execlp("/bin/sh", "sh", "-c", "read", (char *) NULL);
如果您願意,可以使用不同的 shell ( bash
, zsh
等)。
而且, read
消耗輸入並將其存儲在一個或多個 shell 變量中。 它不會產生 output,所以我不確定您希望如何確定它是否讀取任何內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.