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

发布于 2024-09-16 14:42:56 字数 777 浏览 8 评论 0原文

当我在 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);
   }
}

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

林空鹿饮溪 2024-09-23 14:42:56

您应该使用 pclose 而不是 fclose。 (经过测试和验证。)

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

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.

痴情 2024-09-23 14:42:56

请查看此处深入了解解释为什么 fclosepclose 不同以及如何不同。

Take a look here for an in depth reason as to why fclose and pclose differ and how.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文