1. 程式人生 > >給程序指定一個新的執行程式的函式exec()

給程序指定一個新的執行程式的函式exec()

一個程序呼叫exec()函式來執行一個新程式。之後該程序的程式碼段、資料段和堆疊段就被新程式的所代替。新程式從自己的main()函式開始執行。

一個
簡單的exec()呼叫的例子

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>

char *env_list[] = {"USER = kate","PATH = /tmp",NULL};

int main()
{
    pid_t pid;
    pid = fork();
    if(pid < 0)
    {
        printf("fork error\n");
        exit(0);
    }
    else if(pid == 0)
    {
        if(execle("/home/acer/workspace/print1","print1","arg1","arg2",(char *)0,env_list) < 0)
            printf("execle error\n");
        exit(0);
    }
    if(waitpid(pid,NULL,0) < 0){
        printf("WAIT ERROR\n");
    exit(0);
}

    if((pid = fork()) < 0)
    {
        printf("fork error\n");
        exit(0);
    }
    else if(pid == 0)
    {
        if(execlp("/home/acer/workspace/print1","print1","arg1",(char*)0) < 0)
        printf("execle error\n");
        exit(0);
    }
    exit(0);
    return 0;
}

子程序的可執行檔案print1的原始碼為:
#include <stdio.h>
inr main(int argc,char *argv[])
{
    int n;
    char * * ptr;
    extern char * * environ;
    for(n = 0; n < argc; n++)
        printf("arg[%d]:%s\n",n,argv[n]);
    for(ptr = environ; *ptr != 0; ptr++)
        printf("%s\n",*ptr);
    exit(0);
}

分析:print1.c是主程式file4.c中exec函式指派的可執行程式的原始檔名,將傳遞給程式的引數和環境變數進行輸出。下面是一種可能的結果

程式首先呼叫了execlp(),傳遞的引數有可執行程式的路徑名、程式所需的引數及程式執行時的環境變數。