[英]How to redirect stdout to stdin using fork and pipe and execvp in 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.