exec函式族的使用

2021-09-06 12:08:48 字數 1927 閱讀 2533

exec用被執行的程式完全替換呼叫它的程式的影像。fork建立乙個新的程序就產生了乙個新的pid,exec啟動乙個新程式,替換原有的程序,因此這個新的被exec執行的程序的pid不會改變,和呼叫exec函式的程序一樣。

下面來看下exec函式族:

#include

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);

int execve(const char *path, char *const argv, char *const envp);

exec函式族裝入並執行程式pathname,並將引數arg0(arg1,arg2,argv,envp)傳遞給子程式,出錯返回-1。在exec函式族中,字尾l、v、p、e新增到exec後,所指定的函式將具有某種操作能力有字尾:

其中只有execve是真正意義上的系統呼叫,其它都是在此基礎上經過包裝的庫函式。

我們來看下面的乙個例項:

#include

#include

#include

#include

int main(int argc,char *argv,char *envp)

;if(fork()==0)

}if(fork()==0)

}if(fork()==0)

}if(fork()==0)

}if(fork()==0)

}if(fork()==0)

}return 0;

}程式裡呼叫了ls這個linux常用的系統命令。

由於各個子程序執行的順序無法控制,所以有可能出現乙個比較混亂的輸出--各子程序列印的結果交雜在一起,而不是嚴格按照程式中列出的次序。

編譯並執行:

下面我們來分析下所寫的程式。

其實我們留心看一下這6個函式,可以發現前3個函式都是以execl開頭的,後3個都是以execv開頭的。

首先來比較前兩個函式execv和execl。execv開頭的函式是把引數以"char *argv"這樣的形式傳遞命令列引數。而execl開頭的函式採用了我們更容易習慣的方式,把引數乙個乙個列出來,然後以乙個null表示結束,也可以寫成(char *)0。

其次緊跟著的2個以p結尾的函式execlp和execvp。與其他幾個函式相比,除execlp和execvp之外的4個函式都要求,它們的第1個引數path必須是乙個完整的路徑,如"/bin/ls";而execlp和execvp的第1個引數file可以簡單到僅僅是乙個檔名,如"ls",這兩個函式可以自動到環境變數path制定的目錄裡去尋找。

最後兩個函式execle和execve,都使用了char *envp來傳遞環境變數。在全部6個函式中,只有execle和execve需要傳遞環境變數,其它的4個函式都沒有這個引數,這並不意味著它們不傳遞環境變數,這4個函式將把預設的環境變數不做任何修改地傳給被執行的應用程式。而execle和execve會用指定的環境變數去替代預設的那些。

最後要強調一點,大家在平時的程式設計中,如果用到了exec函式族,一定記得要加錯誤判斷語句。因為與其他系統呼叫比起來,exec很容易受傷,被執行檔案的位置,許可權等很多因素都能導致該呼叫的失敗。最常見的錯誤是:

1.    找不到檔案或路徑,此時errno被設定為enoent;

2.    陣列argv和envp忘記用null結束,此時errno被設定為efault;

3.    沒有對要執行檔案的執行許可權,此時errno被設定為eacces。

exec函式族的使用

呼叫shell指令碼命令 execlp sh sh filename char 0 exec用被執行的程式完全替換呼叫它的程式的影像。fork建立乙個新的程序就產生了乙個新的pid,exec啟動乙個新程式,替換原有的程序,因此這個新的被exec執行的程序的pid不會改變,和呼叫exec函式的程序一樣...

exec函式族的使用

exec函式族的使用 exec用被執行的程式完全替換呼叫它的程式的影像。fork建立乙個新的程序就產生了乙個新的pid,exec啟動乙個新程式,替換原有的程序,因此這個新的被exec執行的程序的pid不會改變,和呼叫exec函式的程序一樣。下面來看下exec函式族 include int execl...

exec族函式配合fork函式使用

檔案demo.c include include include include include include include intmain if pid 0 else return0 檔案changdata.c include include include include include i...