2010-09-02 11 views
4

Quand je lance le programme ci-dessous sur mon Mac (OS/X 10.6.4), je reçois la sortie suivante:Pourquoi popen() ne fonctionne qu'une seule fois?

$ ./a.out 
Read 66 lines of output from /bin/ps 
Read 0 lines of output from /bin/ps 
Read 0 lines of output from /bin/ps 
Read 0 lines of output from /bin/ps 
Read 0 lines of output from /bin/ps 

Pourquoi est-ce que popen() lit uniquement les données de la première fois que je l'appelle, et les passes suivantes ne renvoient aucune sortie?

#include <stdio.h> 

int main(int argc, char ** argv) 
{ 
    int i; 
    for (i=0; i<5; i++) 
    { 
     FILE * psAux = popen("/bin/ps ax", "r"); 
     if (psAux) 
     { 
     char buf[1024]; 
     int c = 0; 
     while(fgets(buf, sizeof(buf), psAux)) c++; 
     printf("Read %i lines of output from /bin/ps\n", c); 
     fclose(psAux); 
     } 
     else printf("Error, popen() failed!\n"); 

     sleep(1); 
    } 
} 

Répondre

6

Vous devez utiliser pclose au lieu de fclose. (Testé et vérifié.)

fclose ne réinitialise pas l'état de la conduite, car il est conçu pour fermer fichiers, pas tuyaux. pclose fermera correctement le tuyau, de sorte que vous pouvez le rouvrir avec succès.

2

Jetez un oeil here pour une raison en profondeur pourquoi fclose et pclose diffèrent et comment.

Questions connexes