使用execvp执行grep,以从管道中读取

使用execvp执行grep,以从管道中读取,c,grep,exec,pipe,execvp,C,Grep,Exec,Pipe,Execvp,我试图模仿shell命令行的功能: printenv |grep VISUAL 通过创建子进程,在其中执行grep,并从父函数将环境变量写入连接到grep的管道。但这不起作用;grep函数不断打印我写入它的所有内容(无论我为哪个字符串grep)。这是代码(我删除了错误代码的检查和处理): 一个明显的问题是,您没有向管道写入换行符,这意味着如果您写入的整个字符串中有任何内容匹配,grep将输出整个字符串,因为它只有一行。尝试在第一次写入之后添加第二次写入: write(pipe_fd[PIPE_

我试图模仿shell命令行的功能:

printenv |grep VISUAL
通过创建子进程,在其中执行
grep
,并从父函数将环境变量写入连接到
grep
的管道。但这不起作用;
grep
函数不断打印我写入它的所有内容(无论我为哪个字符串
grep
)。这是代码(我删除了错误代码的检查和处理):


一个明显的问题是,您没有向管道写入换行符,这意味着如果您写入的整个字符串中有任何内容匹配,
grep
将输出整个字符串,因为它只有一行。尝试在第一次写入之后添加第二次写入:

write(pipe_fd[PIPE_WRITE],"\n",1);

如果
execvp()
失败(返回),请始终确保您的程序至少处理错误。如果成功,它不会返回。至少添加
退出(1)
退出(1)但我通常也会将错误消息打印到标准错误。与问题无关,但您在父进程中关闭了两次
pipe\u fd[pipe\u READ]
。@JonathanLeffler,如我所说,我删除了错误处理以使其更易于阅读。@Arkku谢谢!第二个应该关闭写端。无关:您应该真正添加错误处理。这是一个例子。尤其是
write()
调用,否则您可能会错过一些无声的输出。+1:正确的诊断。我想第二个
调用很容易;很容易提出这样的建议:
dprintf(pipe\u fd[pipe\u WRITE],%s\n,envp[i])取而代之。谢谢,成功了!我已经想到了这一点,所以我尝试在我写的每个字符串中添加一个“\n”,但我想我还是失败了。
write(pipe_fd[PIPE_WRITE],"\n",1);