When I run the program below on my Mac (OS/X 10.6.4), I get the following output:
$ ./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
Why is it that popen() only reads data the first time I call it, and subsequent passes return no output?
#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);
}
}
You should use
pcloseinstead offclose. (Tested and verified.)fcloseisn’t resetting the pipe state, since it is designed to close files, not pipes.pclosewill properly close the pipe, so you can reopen it successfully.