Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does popen() only work once?

Tags:

c

macos

popen

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);
   }
}
like image 205
Jeremy Friesner Avatar asked Feb 26 '23 08:02

Jeremy Friesner


1 Answers

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.

like image 178
Peter Avatar answered Mar 06 '23 16:03

Peter