使用exec函式組呼叫執行shell指令碼

2021-06-23 05:20:06 字數 4005 閱讀 5241

linux下的exec函式不是單一的函式,而是乙個函式組,分別為:

[cpp]view plain

copy

intexecl(

const

char

*path, 

const

char

*arg, ...);  

intexeclp(

const

char

*file, 

const

char

*arg, ...);  

intexecle(

const

char

*path, 

const

char

*arg, ..., 

char

* const

envp);  

intexecv(

const

char

*path, 

char

*const

argv);  

intexecvp(

const

char

*file, 

char

*const

argv);  

intexecve(

const

char

*path, 

char

*const

argv, 

char

*const

envp);  

可以看到這個函式組的函式名都是有exec和新增l、v、p、e這四個字母的組合而來。

字母l代表list,表示該函式取乙個參數列,即要求將新程式的每個命令列引數都說明為乙個單獨的引數,必須以(char*)0結尾;

字母v代表vector,表示該函式取乙個argv向量,即要求先構造乙個指向各個引數的陣列指標,然後將該陣列位址作為這個exec函式的引數;

字母p代表path,表示該函式取filename作為引數,並且使用path環境變數尋找可執行檔案;

字母e代表environ,表示該函式取乙個envp陣列,而不使用當前環境。

這裡,字母l和v互斥,即不能同時出現在exec函式中。

exec函式最為常見的是呼叫替換執行可執行檔案,諸如:

execl("/bin/echo","echo", "executed by execl", null)中的echo;

execl("/bin/ls", "ls","/azuo", "-la", (char *)0 )中的ls;

execlp("echo", "echo","executed by execlp", null)中的echo;

但是另外一種執行方式是呼叫執行shell指令碼。

有兩種方法使用exec函式組呼叫shell指令碼:

方法一:使用execl函式,這種方法與execl("/bin/echo", "echo", "executed byexecl", null)中的echo 類似。它直接使用可執行檔案來執行指令碼。

將/bin/echo換為了/bin/sh或/bin/bash。

這樣我們可以使用如下函式呼叫t.sh指令碼

execle("/bin/sh","sh","t.sh",null,null);

可以向t.sh指令碼傳入引數,這裡省略。

方法二:使用execle函式

char* env=;

execle("t.sh","nouse","i'min argv!",null,env);

使用execle函式,也可以向shell指令碼傳遞引數,在指令碼中使用$0,$1$2等等來進行引用,$1為第乙個引數,這個與main函式的argv類似。

這裡execle函式發現pathname引數並不是由連線編輯器產生的機器可執行檔案,則認為該檔案是乙個shell指令碼,於是試圖呼叫/bin/sh,並以filename作shell的輸入。

與上乙個方法不同的是,execl函式執行shell指令碼即使用可執行檔案,不要求t.sh有執行許可權。而execle函式則要求使用者擁有被呼叫的shell指令碼的執行許可權,否則會呼叫失敗,且通常不會提示permission denied錯誤資訊。所以在使用execle呼叫shell指令碼時要確保指令碼自身擁有執行許可權。

這樣的差別和終端下類似:

終端下使用sh t.sh 不需要執行許可權而./t.sh就需要了。

以下為一組具體例項:

t.sh指令碼:

[plain]view plain

copy

#!/bin/bash  

if [ -n "$envargv" ]; then  

echo "you can use the var of env."  

echo "the vat in env:$envargv"  

echo "the var in argv:$1"  

fi  

echo "er,you see me again."  

測試主程式:

tryexec.程式

[cpp]view plain

copy

#include 

#include

#include 

intmain(

intargc,

char

** argv)  

;  strcpy(par,argv[1]);  

if(!strcmp(par,

"execl"

))  

if(!strcmp(par,

"execle1"

))  

if(!strcmp(par,

"execle2"

))  

;  execle("t.sh"

,"nouse"

,"i'm in argv!"

,null,env);  

}  return

0;  

}  

執行結果如下:

[cpp]view plain

copy

root@ubuntu:/home/gs/linuxapiusage# gcc tryexec.c  

root@ubuntu:/home/gs/linuxapiusage# ./a.out execl  

******************execl*****************  

hello,you see me.  

root@ubuntu:/home/gs/linuxapiusage# ./a.out execle1  

**************call shell script (1)*****************  

er,you see me again.  

root@ubuntu:/home/gs/linuxapiusage# ./a.out execle2  此處沒有t.sh的執行許可權  

**************call shell script(2)*****************   

root@ubuntu:/home/gs/linuxapiusage# ./a.out execle2  增加執行許可權 chmod +x t.sh  

**************call shell script(2)*****************  

you can use the var of env.  

the vat in env:"i'm in environment! you see me."

the var in argv:i'm in argv!  

er,you see me again.  

以上為execl和execle來呼叫的shell指令碼,當然使用execv 和 execve也可以,只不過是引數傳入格式的問題了。

更多資訊請參考:

exec相關

或linux下man exec

exec函式組介紹

以及apue 8.10

php呼叫exec函式

在php中,經常遇到php呼叫外部指令碼程式,如exec,system函式 本環境在windows平台下測試 在php中呼叫perl指令碼,perl檔案內容如下 c xampp perl bin perl usejson useencode my val helloworld n my jsonco...

PHP 執行exec函式

exec 執行外部程式 語法 string exec string command array output int return var exec函式解析 exec語法 string exec string command,string array int return var exec返回值 字...

exec函式 python 使用exec的疑惑

簡介 exec 執行儲存在字串或檔案中的python語句,相比於 eval,exec可以執行更複雜的 python exec函式功能強大,也很容易上手,在做未知變數定義時很好用。例如 使用exec函式可以將其中的字串語句定義為變數 with open data.txt r as f for line...