相關函式
fork,execv
e,waitpid,
popen
表頭檔案
#i ncludelib.h>
定義函式
int system(con
st char * string);
函式說明
system()會調
用fork()產生子程序,由子程序來呼叫
/bin/sh-c string來執行參
數string字串
所代表的命令,此命》
令執行完後隨即返回原呼叫的程序。在呼叫s
ystem()期間sigchld 訊號會被暫時擱置,sigint和sigquit 訊號則會被忽略。
返回值
=-1:出現錯誤
=0:呼叫成功
=1:入參字串為空
=127:execl執行失敗
如果system()
在呼叫/bin/sh時失敗則返回127,
其他失敗原因返回-1
。若引數string
為空指標(null)
,則返回非零值1。
如 果system()調
用成功則最後會返回執
行shell命令後的
返回值,但是此返回值
也有可能為 system()呼叫
/bin/sh失敗所
返回的127,因此最
好能再檢查errno
來確認執行成功。
附加說明
在編寫具有suid/
sgid許可權的程式時
請勿使用system
(),system(
)會繼承環境變數,通
過環境變數可能會造成
系統安全的問題。 範例
#includelib.h>
main()
執行結果:
-rw-r--r--
1 root root 705 sep 3 13 :52 /etc/passw d
-r--------
- 1 root root 572 sep 2 15 :34 /etc/shado
例2:char tmp;
sprintf(tm
p,"/bin/mo
unt -t vfat %s /mnt/usb",
dev);
system(tmp
); 其中dev是/dev
/sda1。
system原始碼
#include
#include
#include
#include
int system(con
st char * cmdstring)
if((pid = fork())<0)
else if(pid == 0)
else }
}return status; }
先分析一下原理,然後
再看上面的**大家估
計就能看懂了:
當system接受的
命令為null時直接
返回,否則fork出
乙個子程序,因為fo
rk出兩個程序:父進
程和子程序中都返回,
這裡要檢查返回的pi
d,fork在子程序
中返回0,在父程序中
返回子程序的pid,
父程序使用waitp
id等待子程序結束,
子程序則是呼叫exe
cl來啟動乙個程式代
替自己,execl(
"/bin/sh",
"sh", "-c", cmdstring,
(char*)0)是
呼叫shell,這個
shell的路徑是/
bin/sh,後面的
字串都是引數,然後
子程序就變成了乙個s
hell程序,這個s
hell的引數是cm
dstring,就是
system接受的參
數。 如果上面的你沒有看懂
,那我再解釋下for
k的原理:當乙個程序
a呼叫fork時,系
統核心建立乙個新的進
程b,並將a的記憶體映
像複製到b的程序空間
中,因為a和b是一樣
的,那麼他們怎麼知道
自己是父程序還是子進
程呢,看fork的返
回值就知道,上面也說
了fork在子程序中
返回0,在父程序中返
回子程序的pid。
execl是編譯器的
函式(在一定程度上隱
藏具體系統實現),在
linux中它會接著
產生乙個linux系
統的呼叫execve
, 原型見下:
int execve(con
st char * file,const
char **argv,con
st char **envp);
看到這裡你就會明白為
什麼system()
會接受父程序的環境變
量,但是用syste
m改變環境變數後,s
ystem一返回主函
數還是沒變,原因從s
ystem的實現可以
看到,它是通過產生新
程序實現的,從我的分
析中可以看到父程序和
子程序間沒有程序通訊
,子程序自然改變不了
父程序的環境變數。
linux system函式使用詳解
相關函式 fork,execve,waitpid,popen 表頭檔案 include 定義函式 int system const 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 ...