linux中的popen()函式可以在程式中執行乙個shell命令,並返回命令執行的結果。有兩種操作模式,分別為讀和寫。在讀模式中,程式中可以讀取到命令的輸出,其中有乙個應用就是獲取網路介面的引數。在寫模式中,最常用的是建立乙個新的檔案或開啟其他服務等。
標頭檔案:
#include
函式原型:
file *popen(const char *command, const char *type);
函式說明:
popen()函式通過建立乙個管道,呼叫fork()產生乙個子程序,執行乙個shell以執行命令來開啟乙個程序。這個管道必須由pclose()函式關閉,而不是fclose()函式。pclose()函式關閉標準i/o流,等待命令執行結束,然後返回shell的終止狀態。如果shell不能被執行,則pclose()返回的終止狀態與shell已執行exit一樣。
type引數只能是讀或者寫中的一種,得到的返回值(標準i/o流)也具有和type相應的唯讀或只寫型別。如果type是"r"則檔案指標連線到command的標準輸出;如果type是"w"則檔案指標連線到command的標準輸入。
command引數是乙個指向以null結束的shell命令字串的指標。這行命令將被傳到bin/sh並使用-c標誌,shell將執行這個命令。
popen()的返回值是個標準i/o流,必須由pclose來終止。前面提到這個流是單向的(只能用於讀或寫)。向這個流寫內容相當於寫入該命令的標準輸入,命令的標準輸出和呼叫popen()的程序相同;與之相反的,從流中讀資料相當於讀取命令的標準輸出,命令的標準輸入和呼叫popen()的程序相同。
返回值:
如果呼叫fork()或pipe()失敗,或者不能分配記憶體將返回null,否則返回標準i/o流。popen()沒有為記憶體分配失敗設定errno值。如果呼叫fork()或pipe()時出現錯誤,errno被設為相應的錯誤型別。如果type引數不合法,errno將返回einval。
例子:
#include #include #define buf_size 1024
char buf[buf_size];
int main(void)
while (fgets(buf, buf_size, p_file) != null)
pclose(p_file);
return 0;
}
輸出結果:
root@ye:/home/ye# gcc -wall test_popen.c -o test_popen
root@ye:/home/ye# ./test_popen
eth0 link encap:ethernet hwaddr 00:16:3e:5f:31:4c
inet addr:172.20.110.214 bcast:172.20.110.255 mask:255.255.255.0
inet6 addr: fe80::216:3eff:fe5f:314c/64 scope:link
inet6 addr: 2001:250:3c02:74a:216:3eff:fe5f:314c/64 scope:global
up broadcast running multicast mtu:1500 metric:1
rx packets:683756 errors:0 dropped:2 overruns:0 frame:0
tx packets:8678 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
rx bytes:161460288 (161.4 mb) tx bytes:554406 (554.4 kb)
C語言 popen函式的使用
一 利用system函式呼叫shell命令,只能獲取到shell命令的返回值,而不能獲取shell命令的輸出結果,那如果想獲取輸出結果怎麼辦呢?用popen函式可以實現。二 定義函式 file popen const char command,const char type 函式說明 popen 會...
C語言中的函式
在對c語言有過一定的了解之後,我們都會涉及到乙個概念 函式。那麼,什麼是函式呢?首先,我們來看一段 includeint max int x,int y int main 在上面的程式中,我們將引數a,b傳入到函式max之中,最後求出結果並返回,那麼,這樣寫的好處是什麼呢?我們為什麼要使用函式來實現...
C語言中的函式指標
開啟去年6月的乙個test.cpp檔案,發現對裡面測試的函式指標幾乎沒有印象了。溫故而知新,於是重新找到ansi c 裡面的說明 除了宣告指向整型數字 雙精度型數字和c語言其他資料型別的指標外,指標也能夠被宣告指向乙個函式 包含乙個函式的位址 指向函式的指標是可能的,因為函式名像陣列名一樣,它們本身...