exec函式族的使用

2021-06-06 18:47:53 字數 3714 閱讀 9164

呼叫shell指令碼命令:execlp("sh","sh","filename",(char*)0);

exec用被執行的程式完全替換呼叫它的程式的影像。fork建立乙個新的程序就產生了乙個新的pid,

exec啟動乙個新程式,替換原有的程序,因此這個新的被exec執行的程序的pid不會改變,

和呼叫exec函式的程序一樣。

int 

exec…裝入和執行其它程式:

int 

execl(  char *pathname,char *arg0,char *arg1,...,char *argn,null)

int 

execle( char *pathname,char *arg0,char *arg1,...,char *argn,null,char *envp)

int 

execlp( char *pathname,char *arg0,char *arg1,...,null)

int 

execlpe(char *pathname,char *arg0,char *arg1,...,null,char *envp)

int 

execv(  char *pathname,char *argv)

int 

execve( char *pathname,char *argv,char *envp)

int 

execvp( char *pathname,char *argv)

int 

execvpe(char *pathname,char *argv,char *envp)

exec函式族裝入並執行程式pathname,並將引數

arg0(arg1,arg2,argv,envp)傳遞給子程式,出錯返回-1

在exec函式族中,字尾l、v、p、e新增到exec後,

所指定的函式將具有某種操作能力

有字尾  p時,函式可以利用dos的path變數查詢子程式檔案。

假如你希望執行命令 /bin/cat /etc/passwd /etc/group,

l時,希望接收以逗號分隔的引數列表,列表以null指標作為結束標誌

execl( "/bin/cat","/etc/passed","/etc/group",null);

v時,希望接收到乙個以null結尾的字串陣列的指標

char* argv =

execv( "/bin/cat", argv );

e時,函式傳遞指定引數envp,允許改變子程序的環境,無字尾e時,子程序使用當前程式的環境。

envp也是乙個以null結尾的字串陣列指標

execl(執行檔案)

相關函式

fork,execle,execlp,execv,execve,execvp

表頭檔案

#include

定義函式

int execl(const char * path,const char * arg,....);

函式說明

execl()用來執行引數path字串所代表的檔案路徑,接下來的引數代表執行該檔案時傳遞過去的argv(0)、argv[1]……,最後乙個引數必須用空指標(null)作結束。

返回值 如果執行成功則函式不會返回,執行失敗則直接返回-1,失敗原因存於errno中。

範例 #include

main()

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

execlp(從path 環境變數中查詢檔案並執行)

相關函式

fork,execl,execle,execv,execve,execvp

表頭檔案

#include

定義函式

int execlp(const char * file,const char * arg,……);

函式說明

execlp()會從path 環境變數所指的目錄中查詢符合引數file的檔名,找到後便執行該檔案,然後將第二個以後的引數當做該檔案的argv[0]、argv[1]……,最後乙個引數必須用空指標(null)作結束。

返回值 如果執行成功則函式不會返回,執行失敗則直接返回-1,失敗原因存於errno 中。

錯誤**

參考execve()。

範例#include

main()

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

execv(執行檔案)

相關函式

fork,execl,execle,execlp,execve,execvp

表頭檔案

#include

定義函式

int execv (const char * path, char * const argv[ ]);

函式說明

execv()用來執行引數path字串所代表的檔案路徑,與execl()不同的地方在於execve()只需兩個引數,第二個引數利用陣列指標來傳遞給執行檔案。

返回值 如果執行成功則函式不會返回,執行失敗則直接返回-1,失敗原因存於errno 中。

錯誤**

請參考execve()。

範例#include

main()

};execv(「/bin/ls」,argv);}執行

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

execve(執行檔案)

相關函式

fork,execl,execle,execlp,execv,execvp

表頭檔案

#include

定義函式

int execve(const char * filename,char * const argv[ ],char * const envp[ ]);

函式說明

execve()用來執行引數filename字串所代表的檔案路徑,第二個引數系利用陣列指標來傳遞給執行檔案,

argv要傳遞給程式的完整引數列表,包括argv[0],它一般是執行程式的名字;最後乙個引數則為傳遞給執行檔案的新環境變數陣列。

返回值 如果執行成功則函式不會返回,執行失敗則直接返回-1,失敗原因存於errno 中。

錯誤**

eacces

1. 欲執行的檔案不具有使用者可執行的許可權。

2. 欲執行的檔案所屬的檔案系統是以noexec 方式掛上。

3.欲執行的檔案或script翻譯器非一般檔案。

eperm

1.程序處於被追蹤模式,執行者並不具有root許可權,欲執行的檔案具有suid 或sgid 位。

2.欲執行的檔案所屬的檔案系統是以nosuid方式掛上,欲執行的檔案具有suid 或sgid 位元,但執行者並不具有root許可權

#include

#include

#include

int main( void )

; if ( -1 == (execve("/bin/ls", args, null)) )

puts( "shouldn't get here" );

exit( exit_success );

}[root@localhost src]# gcc execve.c 

[root@localhost src]# ./a.out 

a.out  child_fork.c  execve.c  fork.c  getpid.c

exec函式族的使用

exec函式族的使用 exec用被執行的程式完全替換呼叫它的程式的影像。fork建立乙個新的程序就產生了乙個新的pid,exec啟動乙個新程式,替換原有的程序,因此這個新的被exec執行的程序的pid不會改變,和呼叫exec函式的程序一樣。下面來看下exec函式族 include int execl...

exec函式族的使用

exec用被執行的程式完全替換呼叫它的程式的影像。fork建立乙個新的程序就產生了乙個新的pid,exec啟動乙個新程式,替換原有的程序,因此這個新的被exec執行的程序的pid不會改變,和呼叫exec函式的程序一樣。下面來看下exec函式族 include int execl const char...

exec族函式配合fork函式使用

檔案demo.c include include include include include include include intmain if pid 0 else return0 檔案changdata.c include include include include include i...