#include file *popen(const char *command, const char *type);
int pclose(file *stream);
popen總是和pclose一起出現被使用的。
popen() 建立乙個管道,通過fork或者invoke乙個子程序,然後執行command。返回值在標準io流中,由於是在管道之中,
因此資料流是單向的,command只能產生stdout或者讀取stdin,
因此type只有兩個值:『w』或『r』。
r表示command從管道中讀取資料流,而w表示command的stdout輸出到管道中。
command無法同時讀取和輸出。popen返回該fifo資料流的指標。
char buf[200] = ;
if((fp = popen(「cat > test1″, 「w」)) == null)
fwrite(「read pipe successfully !」, 1, sizeof(「read pipe successfully !」), fp);
pclose(fp);
return 0;
}
執行完畢後,當前目錄下多了乙個test1檔案,開啟,裡面內容為read pipe successfully !
popen函式其實是對管道操作的一些包裝,所完成的工作有以下幾步:
定義函式
int system(const char * string);
函式說明
system()會呼叫fork()產生子程序,由子程序來呼叫/bin/sh-c string來執行引數string字串所代表的命令,此命令執行完後隨即返回原呼叫的程序。
在呼叫system()期間sigchld 訊號會被暫時擱置,sigint和sigquit 訊號則會被忽略。 返回值 =-1:出現錯誤 =0:呼叫成功但是沒有出現子程序 >0:成功退出的子程序的id 如果system()在呼叫/bin/sh時失敗則返回127,其他失敗原因返回-1。
若引數string為空指標(null),則返回非零值》。如果system()呼叫成功則最後會返回執行shell命令後的返回值,但是此返回值也有可能為 system()呼叫/bin/sh失敗所返回的127,因此最好能再檢查errno 來確認執行成功。
在編寫具有suid/sgid許可權的程式時請勿使用system(),system()會繼承環境變數,通過環境變數可能會造成系統安全的問題。 system函式已經被收錄在標準c庫中,可以直接呼叫,使用system()函式呼叫系統命令的基本使用方法如下:
#include int main()
int system(const char * cmdstring)
if((pid = fork())<0)
else if(pid = 0)
else
} }
return status;
}
如果exec執行成功,也即command順利執行完畢,則返回command通過exit或return返回的值。
(注意,command順利執行不代表執行成功,比如command:"rm debuglog.txt",
不管檔案存不存在該command都順利執行了)
如果exec執行失敗,也即command沒有順利執行,比如被訊號中斷,或者command命令根本不存在,system()函式返回127.
如果command為null,則system()函式返回非0值,一般為1.
system函式和popen函式
linux的system函式的實現原始碼 system 會呼叫fork 產生子程序,由子程序來呼叫 bin sh c cmdstring來執行引數cmdstring字串所代表的命令,此命令執行完後隨即返回原呼叫的程序。int system const char cmdstring if pid fo...
popen函式和system函式詳解
我們先用man指令查一下popen函式 函式說明 1 popen 會呼叫fork 產生子程序,然後從子程序中呼叫 bin sh c來執行引數command的指令。2 引數type可使用 r 代表讀取,w 代表寫入。依照此type值,popen 會建立管道連到子程序的標準輸出裝置或標準輸入裝置,然後返...
popen函式和system函式詳解
1 popen函式 我們先用man指令查一下popen函式 函式說明 1 popen 會呼叫fork 產生子程序,然後從子程序中呼叫 bin sh c來執行引數command的指令。2 引數type可使用 r 代表讀取,w 代表寫入。依照此type值,popen 會建立管道連到子程序的標準輸出裝置或...