2010-05-02 18 views
0

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?

Répondre

5

Vous n'avez pas vidé le tampon stdin. Il a tamponné toutes les lignes de certains fichiers même si le descripteur de fichier sous-jacent est restauré.

+0

dang ... me battre en une seconde. :) +1 – falstro

+0

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

+0

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. –

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

La première ligne doit être 'backup = dup (0);'. Sinon, vous rencontrerez toutes sortes de bogues désagréables (sans parler des conditions de course avec des discussions!) Si un autre fichier est ouvert et que vous avez le même fd que 'backup'. –