[英]can not read from pipe with execlp
對於作業,我應該實現linux終端。 我的終端應使用管道支持參數。 像用戶可以輸入: ls | grep ".cpp"
ls | grep ".cpp"
到目前為止,我所做的是:
pid = fork();
if(pid==0)
{
close(fd[0]);
dup2(fd[1],1);
close(fd[1]);
execlp("/bin/ls","ls");
}
wait(NULL);
pid=fork();
if(pid==0)
{
close(fd[1]);
dup2(fd[0],0);
close(fd[0]);
execlp("/bin/grep","grep",".cpp");
}
我的第一個孩子運行良好,將ls的輸出寫入到先前聲明的管道中,但是,我的第二個孩子運行grep,但顯然無法從管道中獲取輸入。 為什么會這樣? 當我運行它時,我的輸出是/ root / OS $ ls | grep的
就這樣被卡住了
不要忽略編譯器警告:
$ gcc lol.c
lol.c: In function ‘main’:
lol.c:14:5: warning: not enough variable arguments to fit a sentinel [-Wformat=]
execlp("/bin/ls","ls");
^
lol.c:23:5: warning: missing sentinel in function call [-Wformat=]
execlp("/bin/grep","grep",".cpp");
^
這是man execlp
:
按照慣例,第一個參數應指向與正在執行的文件關聯的文件名。 參數列表必須以NULL指針終止,並且由於它們是可變參數函數,因此必須將該指針強制轉換為(char *)NULL。
始終使用-Werror
編譯,以便在出現警告時編譯失敗,最好也使用-Wall
來獲取所有潛在問題的警告。
這是您的程序,帶有主要方法和添加的標記:
#include <unistd.h>
#include <sys/wait.h>
int main() {
int fd[2];
int pid;
pipe(fd);
pid = fork();
if(pid==0)
{
close(fd[0]);
dup2(fd[1],1);
close(fd[1]);
execlp("/bin/ls","ls", NULL);
}
wait(NULL);
pid=fork();
if(pid==0)
{
close(fd[1]);
dup2(fd[0],0);
close(fd[0]);
execlp("/bin/grep","grep",".cpp", NULL);
}
return 0;
}
現在是這樣運行的:
$ gcc -Wall -Werror lol.c -o lol
$ ./lol
foo.cpp
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.