linux下execl函式的使用和比較

2021-09-22 12:31:54 字數 3371 閱讀 2148

**:

execl(執行檔案)

相關函式

fork,execle,execlp,execv,execve,execvp

表頭檔案

#include

定義函式

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

函式說明

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

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

範例#include

main()

執行/*執行/bin/ls -al /etc/passwd */

-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的檔名,找到後便執行該檔案,然後將第二個以後的引數當做該檔案的ar**[0]、ar**[1]……,最後乙個引數必須用空指標(null)作結束。

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

錯誤**

參考execve()。

範例/* 執行ls -al /etc/passwd execlp()會依path 變數中的/bin找到/bin/ls */

#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 ar**[ ]);

函式說明

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

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

錯誤**

請參考execve()。

範例/* 執行/bin/ls -al /etc/passwd */

#include

main()

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

-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 ar**[ ],char * const envp[ ]);

函式說明

execve()用來執行引數filename字串所代表的檔案路徑,第二個引數系利用陣列指標來傳遞給執行檔案,最後乙個引數則為傳遞給執行檔案的新環境變數陣列。

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

錯誤**

eacces

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

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

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

eperm

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

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

e2big 引數陣列過大

enoexec 無法判斷欲執行檔案的執行檔案格式,有可能是格式錯誤或無法在此平台執行。

efault 引數filename所指的字串位址超出可訪問空間範圍。

enametoolong 引數filename所指的字串太長。

enoent 引數filename字串所指定的檔案不存在。

enomem 核心記憶體不足

enotdir 引數filename字串所包含的目錄路徑並非有效目錄

eacces 引數filename字串所包含的目錄路徑無法訪問,許可權不足

eloop 過多的符號連線

etxtbusy 欲執行的檔案已被其他程序開啟而且正把資料寫入該檔案中

eio i/o 訪問錯誤

enfile 已達到系統所允許的開啟檔案總數。

emfile 已達到系統所允許單一程序所能開啟的檔案總數。

einval 欲執行檔案的elf執行格式不只乙個pt_interp節區

eisdir elf翻譯器為一目錄

elibbad elf翻譯器有問題。

範例#include

main()

;char * envp[ ]=

execve(「/bin/ls」,ar**,envp);}執行

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

execvp(執行檔案)

相關函式

fork,execl,execle,execlp,execv,execve

表頭檔案

#include

定義函式

int execvp(const char *file ,char * const ar** );

函式說明

execvp()會從path 環境變數所指的目錄中查詢符合引數file 的檔名,找到後便執行該檔案,然後將第二個引數ar**傳給該欲執行的檔案。

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

錯誤**

請參考execve()。

範例/*請與execlp()範例對照*/

#include

main()

;execvp(「ls」,ar**);}執行

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

linux下system和execl函式的區別

今天學到了execl函式族,發現函式功能就是呼叫系統的二進位制程式或者一些指令碼檔案,此函式族函式一大堆,可是仔細想想實現的功能和前面的system函式沒什麼區別,感覺system函式方便多了,為何還要exec弄一大堆呢?肯定是有原因的啦!小結兩點區別關係 1.system會新起乙個子程序來呼叫要執...

Linux下getopt long函式的使用

getopt long為解析命令列引數函式,它是linux c庫函式。使用此函式需要包含系統標頭檔案getopt.h。getopt long函式宣告如下 int getopt long int argc,char const argv,const char optstring,const struc...

Linux中的替換程序execl函式

1.0x80號中斷所引發的中斷會使程式的執行陷入核心,程式執行核心 2.檔案表的概念 檔案表存在於程序描述符pcd中。系統呼叫open每開啟乙個檔案都會在檔案表中新增一項。open的返回值是該檔案在檔案表中的下標。在檔案表中0號下標對應的stdin 鍵盤輸入 的檔案,所以也可以直接使用0來代替std...