歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux進程控制——exec函數族

Linux進程控制——exec函數族

日期:2017/2/28 14:50:06   编辑:Linux教程

1、簡介

在Linux中,並不存在exec()函數,exec指的是一組函數,一共有6個,分別是:

#include <unistd.h>
extern char **environ;
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);


詳細定義:

execl(執行文件)
相關函數
fork,execle,execlp,execv,execve,execvp
表頭文件
#include<unistd.h>
定義函數
int execl(const char * path,const char * arg,....);
函數說明
execl()用來執行參數path字符串所代表的文件路徑,接下來的參數代表執行該文件時傳遞過去的argv(0)、argv[1]……,最後一個參數必須用空指針(NULL)作結束。
返回值
如果執行成功則函數不會返回,執行失敗則直接返回-1,失敗原因存於errno中。
范例
#include<unistd.h>
main()
{
execl(“/bin/ls”,”ls”,”-al”,”/etc/passwd”,(char * )0);
}
執行
/*執行/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<unistd.h>
定義函數
int execlp(const char * file,const char * arg,……);
函數說明
execlp()會從PATH 環境變量所指的目錄中查找符合參數file的文件名,找到後便執行該文件,然後將第二個以後的參數當做該文件的argv[0]、argv[1]……,最後一個參數必須用空指針(NULL)作結束。
返回值
如果執行成功則函數不會返回,執行失敗則直接返回-1,失敗原因存於errno 中。
錯誤代碼
參考execve()。
范例
/* 執行ls -al /etc/passwd execlp()會依PATH 變量中的/bin找到/bin/ls */
#include<unistd.h>
main()
{
execlp(“ls”,”ls”,”-al”,”/etc/passwd”,(char *)0);
}
執行
-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
 
execv(執行文件)
相關函數
fork,execl,execle,execlp,execve,execvp
表頭文件
#include<unistd.h>
定義函數
int execv (const char * path, char * const argv[ ]);
函數說明
execv()用來執行參數path字符串所代表的文件路徑,與execl()不同的地方在於execve()只需兩個參數,第二個參數利用數組指針來傳遞給執行文件。
返回值
如果執行成功則函數不會返回,執行失敗則直接返回-1,失敗原因存於errno 中。
錯誤代碼
請參考execve()。
范例
/* 執行/bin/ls -al /etc/passwd */
#include<unistd.h>
main()
{
char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char*) }};
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<unistd.h>
定義函數
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權限

其中只有execve是真正意義上的系統調用,其它都是在此基礎上經過包裝的庫函數。

exec函數族的作用是根據指定的文件名找到可執行文件,並用它來取代調用進程的內容,換句話說,就是在調用進程內部執行一個可執行文件。這裡的可執行文件既可以是二進制文件,也可以是任何Linux下可執行的腳本文件。

Copyright © Linux教程網 All Rights Reserved