如何恢复被 dup2 覆盖的标准输入?

How to recover stdin overwritten by dup2?

我正在尝试用另一个管道替换标准输入,然后将原始标准输入放回 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.

原件一旦被覆盖(关闭)就无法恢复。你可以做的是在覆盖之前保存一份副本(当然这需要提前计划):

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()(或第二个 dup2()) 调用,除非 exec*() 调用失败。