popen函式和system函式詳解

2021-09-13 03:36:34 字數 1495 閱讀 6395

1、popen函式

我們先用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 #include

2 #include

3 int main()4 1

2345

6789

1011

執行結果:

2、system函式

函式解釋:

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)

else if(pid == 0)

else}}

return status;12

3456

78910

1112

1314

1516

1718

1920

2122

2324

2526

2728

}

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函式詳解

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