exec族函式
阿新 • • 發佈:2018-11-29
作用
在程序的建立上Unix採用了一個獨特的方法,它將程序建立與載入一個新程序映象分離。這樣的好處是有更多的餘地對兩種操作進行管理。
當我們建立了一個程序之後,通常將子程序替換成新的程序映象,這可以用exec系列的函式來進行。當然,exec系列的函式也可以將當前程序替換掉。
例如:在shell命令列執行ps命令,實際上是shell程序呼叫fork複製一個新的子程序,在利用exec系統呼叫將新產生的子程序完全替換成ps程序。
列表
#include <unistd.h>
extern char **environ;
int execl(const char *path, const char *arg, ...
/* (char *) NULL */);
int execlp(const char *file, const char *arg, ...
/* (char *) NULL */);
int execle(const char *path, const char *arg, ...
/*, (char *) NULL, char * const envp[] */);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],
char *const envp[]);
包含這幾個函式,它們都是c函式,呼叫execve這個系統呼叫。
path引數表示你要啟動程式的名稱包括路徑名
arg引數表示啟動程式所帶的引數,一般第一個引數為要執行命令名,不是帶路徑且arg必須以NULL結束
返回值:成功返回0,失敗返回-1
1. 帶l 的exec函式:execl,execlp,execle,表示後邊的引數以可變引數的形式給出且都以一個空指標結束
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
int main()
{
printf("---------- in main pro\n");
execl("/bin/ls", "ls", NULL);
printf("---------- not print\n");
perror("ls");
return 0;
}
利用execl將當前程序main替換掉,所有最後那條列印語句不會輸出
2. 帶 p 的exec函式:execlp,execvp,表示第一個引數path不用輸入完整路徑,只有給出命令名即可,它會在環境變數PATH當中查詢命令
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
int main()
{
printf("---------- in main pro\n");
execlp("ls", "ls", NULL);
printf("---------- not print\n");
perror("ls");
return 0;
}
3. 不帶 l 的exec函式:execv,execvp表示命令所需的引數以char *arg[]形式給出且arg最後一個元素必須是NULL
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
int main()
{
printf("---------- in main pro\n");
char *argv[] = {"ls", NULL};
execvp("ls", argv);
printf("---------- not print\n");
perror("ls");
return 0;
}
4. 帶 e 的exec函式:execle表示,將環境變數傳遞給需要替換的程序
從上述的函式原型中我們發現:
extern char **environ;
此處的environ是一個指標陣列,它當中的每一個指標指向的char為“XXX=XXX”
environ儲存環境資訊的資料可以env命令檢視