так, если я:после 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, когда хочу вернуться к нему?
dang ... избил меня на секунду. :) +1 – falstro
Да, ну, теперь у меня есть setbuf для NULL ... во всяком случае, скажите, у stdin есть буфер, и всякий раз, когда вы перенаправляетесь на другой поток, он берет то, что находится в этом потоке, и добавляет его в свой буфер и держит его там, даже если вы снова перенаправляетесь в другое место? – BobTurbo
Да, файл stdio имеет буферы для данных файла по умолчанию. Дескрипторы файлов, которые используют dup2() и т. Д., Не буферизуются вообще на уровне пользователя. К сожалению (для вас ;-), вызовы дескриптора файла не знают о вызовах stdio верхнего уровня и не делают ничего, чтобы убедиться, что буферы stdio остаются в синхронизации при изменении дескрипторов файлов под носом. –