1. 程式人生 > >exec族函式

exec族函式

作用

在程序的建立上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命令檢視