popen函式和system函式詳解

2021-08-17 17:56:51 字數 1977 閱讀 2881

我們先用man指令查一下popen函式:

函式說明:

(1)popen()會呼叫fork()產生子程序,然後從子程序中呼叫/bin/sh -c來執行引數command的指令。

(2)引數type可使用「r」代表讀取,「w」代表寫入。依照此type值,popen()會建立管道連到子程序的標準輸出裝置或標準輸入裝置,然後返回乙個檔案指標。隨後程序便可利用此檔案指標來讀取子程序的輸出裝置或是寫入到子程序的標準輸入裝置中。

(3)此外,所有使用檔案指標(file*)操作的函式也都可以使用,除了fclose()以外。

(4)如果 type 為 r,那麼呼叫程序讀進 command 的標準輸出。

如果 type 為 w,那麼呼叫程序寫到 command 的標準輸入。

返回值:若成功則返回檔案指標,否則返回null,錯誤原因存於errno中。

**注意:**popen()會繼承環境變數,通過環境變數可能會造成系統安全的問題。

具體例項:

1 #include2 #include3 int main()

4

執行結果:

函式解釋:

system()函式先fork乙個子程序,在這個子程序中呼叫/bin/sh -c來執行command指定的命令。/bin/sh在系統中一般是個軟鏈結,指向dash或者bash等常用的shell,-c選項是告訴shell從字串command中讀取要執行的命令(shell將擴充套件command中的任何特殊字元)。父程序則呼叫waitpid()函式來為變成殭屍的子程序收屍,獲得其結束狀態,然後將這個結束狀態返回給system()函式的呼叫者。

返回值:

(1)當引數command是null的時候

在引數為null的情況下,system函式的返回值很簡單明瞭,只有0和1。

返回1,表明系統的命令處理程式,即/bin/sh是可用的。

相反,如果命令處理程式不可用,則返回0。

(2)當引數command不是null的時候

當引數不為null的時候,情況有些小複雜,根據apue這裡可以分為以下三種情況:

1)如果fork等系統呼叫失敗,或者waitpid函式發生除eintr外的錯誤時,system返回-1

2)一切致使execl失敗的情況下,system返回127

3)除此之外,system返回/bin/sh的終止狀態

system原始碼:

int system(const char * cmdstring)

if((pid = fork())<0)

else if(pid == 0)

else}}

return status;

當system接受的命令為null時直接返回,否則fork出乙個子程序,因為fork在兩個程序:父程序和子程序中都返回,這裡要檢查返回的pid,fork在子程序中返回0,在父程序中返回子程序的pid,父程序使用waitpid等待子程序結束,子程序則是呼叫execl來啟動乙個程式代替自己,execl(「/bin/sh」, 「sh」, 「-c」, cmdstring,(char*)0)是呼叫shell,這個shell的路徑是/bin/sh,後面的字串都是引數,然後子程序就變成了乙個shell程序,這個shell的引數是cmdstring,就是system接受的引數。

system函式和popen函式

include file popen const char command,const char type int pclose file stream popen總是和pclose一起出現被使用的。popen 建立乙個管道,通過fork或者invoke乙個子程序,然後執行command。返回值在標...

system函式和popen函式

linux的system函式的實現原始碼 system 會呼叫fork 產生子程序,由子程序來呼叫 bin sh c cmdstring來執行引數cmdstring字串所代表的命令,此命令執行完後隨即返回原呼叫的程序。int system const char cmdstring if pid fo...

popen函式和system函式詳解

1 popen函式 我們先用man指令查一下popen函式 函式說明 1 popen 會呼叫fork 產生子程序,然後從子程序中呼叫 bin sh c來執行引數command的指令。2 引數type可使用 r 代表讀取,w 代表寫入。依照此type值,popen 會建立管道連到子程序的標準輸出裝置或...