2010-09-02 138 views
4

當我在我的Mac(OS/X 10.6.4)運行下面的程序,我得到下面的輸出:爲什麼popen()只能工作一次?

$ ./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); 
    } 
} 

回答

6

您應該使用pclose而不是fclose。 (測試和驗證。)

fclose未重置管道狀態,因爲它被設計以關閉文件,不管道pclose將正確關閉管道,因此您可以成功重新打開它。

2

看一看here爲什麼fclosepclose爲什麼不同以及如何。

相關問題