donc si je fais:après dup2, le flux contient toujours des contenus anciens?
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
Je trouve à ce moment .. stdin contient encore les deux lignes que je ne l'ai pas consommé. Pourquoi donc? Parce qu'il n'y a qu'un seul tampon, peu importe combien de fois vous redirigez? Comment puis-je me débarrasser des deux lignes restantes mais je me souviens encore où j'étais dans le flux de fichiers lorsque je voulais y revenir?
dang ... me battre en une seconde. :) +1 – falstro
Ouais, eh bien, j'ai setbuf à NULL maintenant ... de toute façon, dites-moi, stdin a un tampon et chaque fois que vous redirigez vers un autre flux, il prend ce qui est dans ce flux et l'ajoute à son tampon et le maintient là même si vous redirigez vers un autre endroit encore? – BobTurbo
Oui stdio stuff a des tampons pour les données de fichier par défaut. Les descripteurs de fichier utilisés par dup2(), etc. ne sont pas mis en mémoire tampon au niveau de l'utilisateur. Malheureusement (pour vous ;-), les appels de descripteur de fichier ne connaissent pas les appels stdio de niveau supérieur et ne font rien pour s'assurer que les tampons stdio restent synchronisés lorsque vous changez les descripteurs de fichiers sous leur nez. –