5进程原语:execl(),execlp(),execle(),execv(),execvp(),execvp(),execve()
1.exec族依賴的頭文件
#include<unistd.h>
extern char**environ;
2函數聲明
//第一個參數:可執行程序所在的絕對位置
//第二個參數:可執行程序運行時所需的參數,這里是一個可變參數,每個參數之間用逗號分割
//參數結束時,最后一個參數是:NULL
int execl(constchar *path, const char *arg, ...);
?
//注意,這里函數名加了p,表示調用了系統的環境變量中配置的PATH,查看環境變量命令:Echo $PATH
?
//第一個參數:只需要寫上文件名即可,不用寫全路徑,后面的參數和上面的參數相同
int execlp(constchar *file, const char *arg, ...);
?
//第一個參數:全路徑
//envp[],表示傳遞的是環境變量的數組
int execle(constchar *path, const char *arg,
????????????????? ..., char * const envp[]);
?
//這個和第一個exec函數區別是,這里的參數不是可變參數了,而是通過一個傳遞一個數組的方式進行傳遞進去。
int execv(constchar *path, char *const argv[]);
?
//execvp和execv的區別僅僅是文件名和路徑的區別。
int execvp(constchar *file, char *const argv[]);
?
//這時候傳遞環境變量
int execvpe(constchar *file, char *const argv[],
?????????????????? char *const envp[]);
?
3.注意:
?? A:這些函數如果調用成功則加載新的程序從啟動代碼開始執行,不再返回,如果調用出錯則返回-1,所以exec函數只有出錯的返回值而沒有成功的返回值。
?? B: 這些函數原型看起來很容易混,但只要掌握了規律就很好記。不帶字母p(表示
path)的exec函數第一個參數必須是程序的相對路徑或絕對路徑,例如“/bin/ls”或“./
a.out”,而不能是“ls”或“a.out”。對于帶字母p的函數:
如果參數中包含/,則將其視為路徑名。
否則視為不帶路徑的程序名,在PATH環境變量的目錄列表中搜索這個程序。
帶有字母l(表示list)的exec函數要求將新程序的每個命令行參數都當作一個參數傳
給它,命令行參數的個數是可變的,因此函數原型中有…,…中的最后一個可變參數應該是
NULL,起sentinel的作用。對于帶有字母v(表示vector)的函數,則應該先構造一個指向
各參數的指針數組,然后將該數組的首地址當作參數傳給它,數組中的最后一個指針也應該
是NULL,就像main函數的argv參數或者環境變量表一樣。
C:對于以e(表示environment)結尾的exec函數,可以把一份新的環境變量表傳給它,其他exec函數仍使用當前的環境變量表執行新程序。
??? D:exec調用舉例如下:
char *const ps_argv[] ={"ps","-o", "pid,ppid,pgrp,session,tpgid,comm", NULL};
char *const ps_envp[]={"PATH=/bin:/usr/bin", "TERM=console", NULL};
execl("/bin/ps", "ps","-o", "pid,ppid,pgrp,session,tpgid,comm", NULL);
execv("/bin/ps", ps_argv);
execle("/bin/ps", "ps","-o", "pid,ppid,pgrp,session,tpgid,comm", NULL, ps_envp);
execve("/bin/ps", ps_argv,ps_envp);
execlp("ps", "ps","-o", "pid,ppid,pgrp,session,tpgid,comm", NULL);
execvp("ps", ps_argv);
E: 事實上,只有execve是真正的系統調用,其它五個函數最終都調用execve,所以execve在man手冊第2節,其它函數在man手冊第3節。這些函數之間的關系如下圖所示。
?
4.案例說明:
運行結果:
5. 由于exec函數只有錯誤返回值,只要返回了一定是出錯了,所以不需要判斷它的
返回值,直接在后面調用perror即可。注意在調用execlp時傳了兩個“ps”參數,第一
個“ps”是程序名,execlp函數要在PATH環境變量中找到這個程序并執行它,而第二
個“ps”是第一個命令行參數,execlp函數并不關心它的值,只是簡單地把它傳給ps程
序,ps程序可以通過main函數的argv[0]取到這個參數。
調用exec后,原來打開的文件描述符仍然是打開的。利用這一點可以實現I/O重定向。
先看一個簡單的例子,把標準輸入轉成大寫然后打印到標準輸出:
運行結果:
運行結果:
分析:
wrapper程序將命令行參數當作文件名打開,將標準輸入重定向到這個文件,然后調用
exec執行upper程序,這時原來打開的文件描述符仍然是打開的,upper程序只負責從標準輸入讀入字符轉成大寫,并不關心標準輸入對應的是文件還是終端。
??? exec族
l 命令行參數列表
p 搜素file時使用path變量
v 使用命令行參數數組
e 使用環境變量數組,不使用進程原有的環境變量,設置新加載程序運行的環境變量
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的5进程原语:execl(),execlp(),execle(),execv(),execvp(),execvp(),execve()的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 莫高股份是做什么的
- 下一篇: 3进程状态getrlimit()函数和s