Как восстановить stdin, перезаписанный dup2? - PullRequest
0 голосов
/ 25 декабря 2018

Я пытаюсь заменить стандартный ввод другим каналом, а затем поместить исходный ввод обратно в 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 голосов
/ 25 декабря 2018

Вы не можете восстановить оригинал после того, как он был перезаписан (закрыт).Что вы можете сделать, это сохранить копию перед тем, как перезаписать ее (что, конечно, требует предварительного планирования):

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*() не будет выполнен.

...