system函式和popen函式

2021-08-29 03:55:30 字數 1790 閱讀 9213

#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 會建立管道連到子程序的標準輸出裝置或...