为什么popen()只能工作一次?

时间:2010-09-02 04:00:38

标签: c macos popen

当我在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 个答案:

答案 0 :(得分:6)

您应该使用pclose代替fclose。 (经过测试和验证。)

fclose未重置管道状态,因为它旨在关闭文件,而不是管道pclose将正确关闭管道,因此您可以成功重新打开它。

答案 1 :(得分:2)

查看here,深入了解fclosepclose为何不同以及如何区别。