一、利用system函式呼叫shell命令,只能獲取到shell命令的返回值,而不能獲取shell命令的輸出結果,那如果想獲取輸出結果怎麼辦呢?用popen函式可以實現。
二、定義函式:file * popen(const char * command, const char * type);
函式說明:popen()會呼叫fork()產生子程序,然後從子程序中呼叫/bin/sh -c 來執行引數command 的指令。
引數type 可使用 "r"代表讀取,"w"代表寫入。依照此type 值,popen()會建立管道連到子程序的標準輸出裝置或標準輸入裝置,然後返回乙個檔案指標。隨後程序便可利用此檔案指標來讀取子程序的輸出裝置或是寫入到子程序的標準輸入裝置中。
此外,所有使用檔案指標(file*)操作的函式也都可以使用,除了fclose()以外。
返回值:若成功則返回檔案指標, 否則返回null, 錯誤原因存於errno 中.
三、例項測試
1、popen.c
#include "stdio.h"
#include "stdlib.h"
int popen_system(const char * cmd, char *pretmsg, int msg_len)
if ((fp = popen(cmd, "r") ) == null)
else
if ( (res = pclose(fp)) == -1)
//pretmsg[strlen(pretmsg)-1] = '\0';
pretmsg[strlen(pretmsg)] = '\0';
return 0; }}
void popen_read(const char*cmd)
; if((fp = popen(cmd, "r")) == null)
while(fgets(buf, 200, fp) != null)
pclose(fp);
}void popen_write(const char*cmd)
; if((fp = popen(cmd, "w")) == null)
fwrite("read pipe successfully !", 1, sizeof("read pipe successfully !"), fp);
pclose(fp);
}int main()
; int ret = 0;
int i=0;
memset(a8result, 0, strlen(a8result));
ret=popen_system(cmd, a8result, sizeof(a8result));
printf("ret = %d a8result = %s length = %d \n", ret, a8result, strlen(a8result));
popen_read("./return");
popen_read("pwd");
popen_read("touch hellop.txt");
popen_write("cat > test1");//
return 0;
}
2、編譯&執行
C語言中的popen 函式
linux中的popen 函式可以在程式中執行乙個shell命令,並返回命令執行的結果。有兩種操作模式,分別為讀和寫。在讀模式中,程式中可以讀取到命令的輸出,其中有乙個應用就是獲取網路介面的引數。在寫模式中,最常用的是建立乙個新的檔案或開啟其他服務等。標頭檔案 include函式原型 file po...
linux的popen函式使用
有了popen,使得linux開發的程式相當於可以輕鬆呼叫這台機器上的任何程式,因為popen執行命令後,可以返回執行輸出結果供程式使用 使用範例 include include strlen include include includeusing namespace std execute sh...
popen函式的實現
注 本文 本人有修改對 open max 的呼叫 popen函式的實現包括一下幾步 1 使用pipe 建立管道 2 使用fork 建立子程序 3 在子程序中呼叫exec族函式執行命令,通過管道將結果傳送至父程序 4 在主程序中等待子程序執行,子程序執行完成後將接收其結果,返回結果的檔案指標 類似與s...