如何恢复被dup2覆盖的stdin?

时间:2018-12-25 18:44:06

标签: c unix file-descriptor dup

我正在尝试用另一个管道替换标准输入,然后将原始标准输入放回fd#0。

例如

dup2(p, 0); // p is a pre-existing fd of a pipe
exec(/* some commands */);

//what will be here in order to have the original stdin back?

scanf(...) //continue processing with original stdin.

1 个答案:

答案 0 :(得分:5)

一旦原始文件被覆盖(关闭),您将无法恢复。您可以做的是在覆盖它之前保存它的副本(当然,这需要事先计划):

int old_stdin = dup(STDIN_FILENO);

dup2(p, STDIN_FILENO);
close(p);               // Usually correct when you dup to a standard I/O file descriptor.

…code using stdin…

dup2(old_stdin, STDIN_FILENO);
close(old_stdin);       // Probably correct
scanf(…);

但是,您的代码中提到了exec(…some commands…); —如果它是POSIX execve()函数家族之一,那么您将不会达到scanf()(或第二个{{1} })呼叫,除非dup2()呼叫失败。