2010-05-02 4 views
0

так, если я:после dup2, поток все еще содержит старое содержимое?

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, когда хочу вернуться к нему?

ответ

5

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

+0

dang ... избил меня на секунду. :) +1 – falstro

+0

Да, ну, теперь у меня есть setbuf для NULL ... во всяком случае, скажите, у stdin есть буфер, и всякий раз, когда вы перенаправляетесь на другой поток, он берет то, что находится в этом потоке, и добавляет его в свой буфер и держит его там, даже если вы снова перенаправляетесь в другое место? – BobTurbo

+0

Да, файл stdio имеет буферы для данных файла по умолчанию. Дескрипторы файлов, которые используют dup2() и т. Д., Не буферизуются вообще на уровне пользователя. К сожалению (для вас ;-), вызовы дескриптора файла не знают о вызовах stdio верхнего уровня и не делают ничего, чтобы убедиться, что буферы stdio остаются в синхронизации при изменении дескрипторов файлов под носом. –

0
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 
+0

Первая строка должна быть 'backup = dup (0);'. В противном случае вы столкнетесь со всякими неприятными ошибками (не говоря уже о гоночных условиях с потоками!), Если другой файл откроется и, как ожидается, получит тот же fd, что и «backup». –

 Смежные вопросы

  • Нет связанных вопросов^_^