linux system函式使用詳解

2021-09-30 05:22:01 字數 2200 閱讀 4280

相關函式

fork,execve,waitpid,popen

表頭檔案

#include

定義函式

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()會繼承環境變數,通過環境變數可能會造成系統安全的問題。

範例#include

main()

system(「ls -al /etc/passwd /etc/shadow」);

執行結果:

-rw-r--r-- 1 root root 705 sep 3 13 :52 /etc/passwd

-r--------- 1 root root 572 sep 2 15 :34 /etc/shado

例2:char tmp;

sprintf(tmp,"/bin/mount -t vfat %s /mnt/usb",dev);

system(tmp);

其中dev是/dev/sda1。

system原始碼

int system(const char * cmdstring)

pid_t pid;

int status;

if(cmdstring == null){

return (1);

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

status = -1;

else if(pid == 0){

execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);

-exit(127);  //子程序正常執行則不會執行此語句

else{

while(waitpid(pid, &status, 0) < 0){

if(errno != einter){

status = -1;

break;

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接受的引數。在windows中的shell是command,想必大家很熟悉shell接受命令之後做的事了。

如果上面的你沒有看懂,那我再解釋下fork的原理:當乙個程序a呼叫fork時,系統核心建立乙個新的程序b,並將a的記憶體映像複製到b的程序空間中,因為a和b是一樣的,那麼他們怎麼知道自己是父程序還是子程序呢,看fork的返回值就知道,上面也說了fork在子程序中返回0,在父程序中返回子程序的pid。

execl是編譯器的函式(在一定程度上隱藏具體系統實現),在linux中它會接著產生乙個linux系統的呼叫execve, 原型見下:

int execve(const char * file,const char **ar**,const char **envp);

看到這裡你就會明白為什麼system()會接受父程序的環境變數,但是用system改變環境變數後,system一返回主函式還是沒變,原因從 system的實現可以看到,它是通過產生新程序實現的,從我的分析中可以看到父程序和子程序間沒有程序通訊,子程序自然改變不了父程序的環境變數。

linux system函式使用詳解

相關函式 fork,execv e,waitpid,popen 表頭檔案 i ncludelib.h 定義函式 int system con st char string 函式說明 system 會調 用fork 產生子程序,由子程序來呼叫 bin sh c string來執行參 數string字串...

Linux system函式詳解

system 功能 system 函式呼叫 bin sh c command 執行特定的命令,阻塞當前程序直到command命令執行完畢 原型 int system const char command 返回值 如果無法啟動shell執行命令,system將返回127 出現不能執行system呼叫的...

linux system系統呼叫

為了簡化執行命令的複雜程度,linux系統提供system系統呼叫,原理是通過fork的方式產生乙個子程序,在這個子程序中執行系統呼叫過程中引數裡面設定的command。includeint system const char command 利用fork建立子程序,然後用execl來執行 bin ...