0

我在 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),否则,我收到错误消息,不存在这样的文件。

4

1 回答 1

0

它是 grep 的第一个参数的引号导致问题。如果我在输入时摆脱它,它会很好地工作。例如'cat aa | grep drw' 而不是 'cat aa | grep“某事”'

于 2015-09-21T07:49:58.710 回答