C 管道读卡器不';看不到EOF或EOS

C 管道读卡器不';看不到EOF或EOS,c,C,在这个函数中,如何使父对象停止尝试从管道读取数据。也就是说,如果我运行命令ls | grep test grep不会输出test和test.c,然后等待用户输入 pipe(pipefd); int pid = fork(); if (pid != 0) { dup2(pipefd[0], STDIN_FILENO); int rv2 = execv(get_contain_dir(command_to), args_to); close(pipefd[0]); } el

在这个函数中,如何使父对象停止尝试从管道读取数据。也就是说,如果我运行命令ls | grep test grep不会输出
test
test.c
,然后等待用户输入

pipe(pipefd);

int pid = fork();
if (pid != 0) {
    dup2(pipefd[0], STDIN_FILENO);
    int rv2 = execv(get_contain_dir(command_to), args_to);
    close(pipefd[0]);
} else {
    dup2(pipefd[1], STDOUT_FILENO);
    int rv1 = execv(get_contain_dir(command_from), args_from);
    close(pipefd[1]);
}

您没有正确关闭管道。每个流程必须关闭不使用的管道:

int pid = fork();
if (pid != 0) {
    dup2(pipefd[0], STDIN_FILENO);
    close(pipefd[1]); // not using the left side
    int rv2 = execv(get_contain_dir(command_to), args_to);

} else {
    dup2(pipefd[1], STDOUT_FILENO);
    close(pipefd[0]);  // not using the right side 
    int rv1 = execv(get_contain_dir(command_from), args_from);
}

你能更好地解释一下你想要实现什么吗?是否要将父对象的标准输出重定向到子对象的标准输入?(您应该添加标签linux)我正在尝试在c中模拟控制台管道。父级输出中执行的任何内容都通过管道传输到子级(通过STDOUT/STDIN)。上面的代码运行正常,管道正常,但它似乎不想关闭管道。也就是说,在我的原始示例中,在“grep”之后,命令“保持打开”,接受用户的输入。由于我现在正在运行,它完全退出了我的程序(这也是错误的)。