после dup2 поток все еще содержит старое содержимое? - PullRequest
0 голосов
/ 02 мая 2010

так что если я сделаю:

dup2(0, backup); // backup stdin
dup2(somefile, 0); // somefile has four lines of content
fgets(...stdin); // consume one line
fgets(....stdin); // consume two lines
dup2(backup, 0); // switch stdin back to keyboard

Я обнаружил, что в этом месте stdin все еще содержит две строки, которые я не употреблял. Это почему? Потому что есть только один буфер независимо от того, сколько раз вы перенаправляете? Как мне избавиться от двух оставшихся строк, но помнить, где я был в потоке somefile, когда я хочу вернуться к нему?

Ответы [ 2 ]

5 голосов
/ 02 мая 2010

Вы не очистили буфер stdin. Он буферизовал все строки somefile, даже если основной дескриптор файла восстановлен.

0 голосов
/ 02 мая 2010
dup2(0, backup); // backup stdin 
dup2(somefile, 0); // somefile has four lines of content 
fgets(...stdin); // consume one line 
fgets(....stdin); // consume two lines 
dup2(backup, 0); // switch stdin back to keyboard
...