C語言執行shell命令

2021-07-27 12:16:59 字數 1620 閱讀 5284

1、system(執行shell 命令)

相關函式 fork,execve,waitpid,popen

表頭檔案 #include

定義函式 int system(const char * string);

函式說明 system()會呼叫fork()產生子程序,由子程序來呼叫/bin/sh-c

string來執行引數string字串所代表的命令,此命令執行完後隨

即返回原呼叫的程序。在呼叫system()期間sigchld 訊號會被暫時

擱置,sigint和sigquit 訊號則會被忽略。

返回值 如果system()在呼叫/bin/sh時失敗則返回127,其他失敗原因返回-

1。若引數string為空指標(null),則返回非零值。如果system()調

用成功則最後會返回執行shell命令後的返回值,但是此返回值也有

可能為system()呼叫/bin/sh失敗所返回的127,因此最好能再檢查

errno 來確認執行成功。

附加說明 在編寫具有suid/sgid許可權的程式時請勿使用system(),system()會

繼承環境變數,通過環境變數可能會造成系統安全的問題。

範例:

#include

<

stdlib.h

>

main()

2、popen(建立管道i/o)

相關函式 pipe,mkfifo,pclose,fork,system,fopen

表頭檔案 #include

定義函式 file * popen( const char * command,const char * type);

函式說明 popen()會呼叫fork()產生子程序,然後從子程序中呼叫/bin/sh -c

來執行引數command的指令。引數type可使用「r」代表讀取,「w」

代表寫入。依照此type值,popen()會建立管道連到子程序的標準輸

出裝置或標準輸入裝置,然後返回乙個檔案指標。隨後程序便可利

用此檔案指標來讀取子程序的輸出裝置或是寫入到子程序的標準輸

入裝置中。此外,所有使用檔案指標(file*)操作的函式也都可以使

用,除了fclose()以外。

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

錯誤** einval引數type不合法。

注意事項 在編寫具suid/sgid許可權的程式時請盡量避免使用popen(),popen()

會繼承環境變數,通過環境變數可能會造成系統安全的問題。

範例:

#includemain()

執行 root :x:0 0: root: /root: /bin/bash 

3、使用vfork()新建子程序,然後呼叫exec函式族

#include

<

unistd.h

>

main();if

(vfork() ==

0)else

}

在C語言中執行shell命令

在 c語言中執行shell 命令1 system 系統呼叫 int system const char string system 會呼叫fork 產生子程序,由子程序來呼叫 bin sh c string 來執行引數string字串所代表的命令,此命令執行完後隨即返回原呼叫的程序。在呼叫syste...

go語言執行shell命令

go語言執行shell命令 package main import os exec fmt os strings func main 預設輸出有乙個換行 fmt.println string whoami 指定引數後過濾換行符 fmt.println strings.trim string whoa...

go語言執行shell命令

go語言執行shell命令 package main import os exec fmt os strings func main 預設輸出有乙個換行 fmt.println string whoami 指定引數後過濾換行符 fmt.println strings.trim string whoa...