簡體   English   中英

無法使用execlp從管道讀取

[英]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.

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