Dup2() 用法和输出重定向

Dup2() usage and output redirection

我正在尝试将一个进程的输出重定向到另一个进程的 stdin。这是由 dup2() 完成的。我的问题是:stdinstdout 在函数终止后返回到它们的 place(0,1),还是我必须做类似 savestdin = dup(0) 的事情。更清楚的是,在一个命令的函数终止后,在第二次调用时 stdinstdout 在它们应该的位置?

要让您的 stdout 进入 forked 流程' stdin,您需要结合使用 pipedup.还没有测试过,但希望它能给你一些想法:

int my_pipe[2];

pipe(my_pipe); // my_pipe[0] is write end
               // my_pipe[1] is read end

// Now we need to replace stdout with the fd from the write end
// And stdin of the target process with the fd from the read end

// First make a copy of stdout
int stdout_copy = dup(1);

// Now replace stdout
dup2(my_pipe[0], 1);

// Make the child proccess
pid_t pid = fork();
if (pid == 0)
{
    // Replace stdin
    dup2(my_pipe[1], 0);
    execv(....); // run the child program
    exit(1); // error
}
int ret;
waitpid(pid, &ret, 0);

// Restore stdout
dup2(stdout_copy, 1);
close(stdout_copy);

close(my_pipe[0]);
close(my_pipe[1]);

所以回答你的问题,当你用dup2()替换01时,除非你用[保存原始文件描述符,否则它们不会恢复到终端=19=] 并使用 dup2().

手动恢复它