Почему popen () работает только один раз? - PullRequest
4 голосов
/ 02 сентября 2010

Когда я запускаю программу ниже на моем Mac (OS / X 10.6.4), я получаю следующий вывод:

$ ./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

Почему popen () читает данные только в первый раз, когда явызвать его, и последующие проходы не вернут ничего?

#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);
   }
}

Ответы [ 2 ]

6 голосов
/ 02 сентября 2010

Вы должны использовать pclose вместо fclose. (Проверено и проверено.)

fclose не сбрасывает состояние канала, так как он предназначен для закрытия файлов , а не каналов . pclose правильно закроет трубу, так что вы можете снова открыть ее.

2 голосов
/ 02 сентября 2010

Посмотрите здесь , чтобы глубже понять, почему fclose и pclose отличаются и как.

...