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 pclose
instead of fclose
. (Tested and verified.)
fclose
isn't resetting the pipe state, since it is designed to close files, not pipes. pclose
will properly close the pipe, so you can reopen it successfully.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With