シェルコマンドラインの機能を模倣しようとしています:
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]);
}
}