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...