系統調用exec

fork()只能建立相同程序的副本
Linux 還提供了系統調用 exec 系列,它可以用於新程序的運行。exec 系列中的系統調用都完成相同的功能,它們把一個新程序裝入調用進程的內存空間,來改變調用進程的執行代碼,從而形成新進程。如果 exec 調用成功,調用進程將被覆蓋,然後從新程序的入口開始執行。這樣就產生了一個新的進程,但是它的進程標識符與調用進程相同。這就是說,exec 沒有建立一個與調用進程併發的新進程,而是用新進程取代了原來的進程。所以, exec 調用成功後,對沒有任何數據返回,這與 fork()不同。下面給出了 exec 系列調用在 Linux 系統庫中 unistd.h 中的函數聲明:
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[]);

程序:

#include <stdio.h>
#include <unistd.h>

main()
{
    printf("Executing ls\n");
    execl("/bin/ls","ls","-l",NULL);

    /*如果execl返回,說明調用失敗*/
    perror("execl failed to run ls");
    exit(1);
}

gcc -o execltest execltest.c
    execltest.c: In function ‘main’:
    execltest.c:11:2: warning: incompatible implicit declaration of built-in function ‘exit’ [enabled by default]


$ ./execltest

Executing ls
total 28
-rwxrwxr-x 1 zhshyii zhshyii 7274 2012-06-19 06:32 execltest
-rw-rw-r-- 1 zhshyii zhshyii  202 2012-06-19 06:32 execltest.c
-rw-rw-r-- 1 zhshyii zhshyii  210 2012-06-19 06:32 execltest.c~
-rwxrwxr-x 1 zhshyii zhshyii 7236 2012-06-19 06:15 forktest
-rw-rw-r-- 1 zhshyii zhshyii  284 2012-06-19 06:14 forktest.c

請注意,程序在 execl()調用後緊跟着一個對庫例行程序 perror()的無條件調用。這是因爲,如果調用程序還存在,並且 execl()調用返回,那麼肯定是 execl()調用出錯了。這時,
execl()和其它 exec 調用總是返回-1。這也就是說,只要 execl()和其它 exec 調用成功,就肯定清除了調用程序而代之以新的程序。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章