Dup2() 用法和输出重定向
Dup2() usage and output redirection
我正在尝试将一个进程的输出重定向到另一个进程的 stdin
。这是由 dup2()
完成的。我的问题是:stdin
和 stdout
在函数终止后返回到它们的 place(0,1)
,还是我必须做类似 savestdin = dup(0)
的事情。更清楚的是,在一个命令的函数终止后,在第二次调用时 stdin
和 stdout
在它们应该的位置?
要让您的 stdout
进入 fork
ed 流程' stdin
,您需要结合使用 pipe
和 dup
.还没有测试过,但希望它能给你一些想法:
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()
替换0
和1
时,除非你用[保存原始文件描述符,否则它们不会恢复到终端=19=] 并使用 dup2()
.
手动恢复它
我正在尝试将一个进程的输出重定向到另一个进程的 stdin
。这是由 dup2()
完成的。我的问题是:stdin
和 stdout
在函数终止后返回到它们的 place(0,1)
,还是我必须做类似 savestdin = dup(0)
的事情。更清楚的是,在一个命令的函数终止后,在第二次调用时 stdin
和 stdout
在它们应该的位置?
要让您的 stdout
进入 fork
ed 流程' stdin
,您需要结合使用 pipe
和 dup
.还没有测试过,但希望它能给你一些想法:
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()
替换0
和1
时,除非你用[保存原始文件描述符,否则它们不会恢复到终端=19=] 并使用 dup2()
.