相關函式
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 ...