Вы не можете восстановить оригинал после того, как он был перезаписан (закрыт).Что вы можете сделать, это сохранить копию перед тем, как перезаписать ее (что, конечно, требует предварительного планирования):
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*()
не будет выполнен.