1

シェルコマンドラインの機能を模倣しようとしています:

printenv |grep VISUAL

子プロセスを作成し、その中で実行grepし、親関数から環境変数を に接続されたパイプに書き込むことによってgrep。ただし、これは機能しません。関数は、grep私が書いたすべてのものを出力し続けます(私がどんな文字列をgrep求めても)。これはコードです(エラーコードのチェックと処理を削除しました):

#define PIPE_READ 0
#define PIPE_WRITE 1
pid_t pid;


int main(int argc, char *argv[], char *envp[])
{
   int pipe_fd[2];
   int return_value, status;
       return_value=pipe(pipe_fd);
       pid=fork();
    if(pid==0)
    {
        dup2(pipe_fd[PIPE_READ], STDIN_FILENO); /*Grep should read from pipe*/
        close(pipe_fd[PIPE_READ]);
        close(pipe_fd[PIPE_WRITE]);
        char *arg_list[] = {"grep", "VISUAL",NULL};
        execvp("grep", arg_list); /*here somewhere is where I think the problem 
  lies, although I've tried everything here. The first argument is the command to
  execute, the second is the name of it again, the thirt should be the string to 
  search for and a file is optional, if there's no file it should read from 
  stdin (the pipe).*/
     }

     else /*parent process*/
     {
         close(pipe_fd[PIPE_READ]);
         int i;
                     /*Write the environment variables to the pipe.*/
         for(i=0; envp[i]!=NULL; i++)
         {
            write(pipe_fd[PIPE_WRITE],envp[i], strlen(envp[i]));
         }
         close(pipe_fd[PIPE_READ]);


     }
}
4

1 に答える 1

3

明らかな問題の 1 つは、パイプに改行を書き込まないことです。つまり、書き込む文字列全体に何かが一致すると、grep1 行しかないため、文字列全体が出力されます。最初の書き込みの後に 2 番目の書き込みを追加してみてください。

write(pipe_fd[PIPE_WRITE],"\n",1);
于 2013-11-21T19:03:41.907 に答える