我在 C 中实现管道。当我尝试命令'cat aa | grep "something" ' 在我的程序中。grep 进程就挂在那里,似乎在等待输入。我不知道为什么。这里是核心代码。只需将 ExecuteCommand 视为简单地调用 execve 函数,并且所有参数都正确传递。
if ((pid = fork()) < 0)
{
perror("fork failed\n");
exit(1);
}
if (pid)
{ // parent as pipe WRITER
close(pd[0]);
close(1);
// replace input with pipe
dup(pd[1]);
// recursively call next commands
ExecuteCommand(cmds, env);
FreeCommandsArray(&cmds);
exit(0);
}
else
{ // child as pipe READER
close(pd[1]);
close(0); // close its READ end
dup(pd[0]);
ExecuteCommand(*(++splitCmds), env);
FreeCommandsArray(&cmds);
exit(0);
}
完整代码是开放的。另一个问题是我必须使用命令文件的完整路径作为 execve 的第一个参数(例如 /bin/ls 用于 ls),否则,我收到错误消息,不存在这样的文件。