fork創建子進程后執行的是和父進程相同的程序(但有可能執行不同的代碼分支),子進程往往要調用一種exec函數以執行另一個程序。當進程調用一種exec函數時,該進程的用戶空間代碼和數據完全被新程序替換,從新程序的啟動例程開始執行。調用exec并不創建新進程,所以調用exec前后該進程的id并未改變。
將當前進程的.text、.data替換為所要加載的程序的.text、.data,然后讓進程從新的.text第一條指令開始執行,但進程ID不變,換核不換殼。
execlp
int execl(const char *path, const char *arg, ...);
加載一個進程,借助PATH環境變量
參數1:要加載的程序的名字。該函數需要配合PATH環境變量來使用,當PATH中所有目錄搜索后沒有參數1則出錯返回。
??? ?該函數通常用來調用系統程序。如:ls、date、cp、cat等命令。
如execlp("ls", "xxx", "-l", "NULL");該函數相當于執行ls -l ,其中第二個參數相當于argv[0],無實際意義
?
execl
int execlp(const char *file, const char *arg, ...);
? ? ?加載一個進程, 通過 路徑+程序名 來加載。
如execl("/bin/ls", "xxx", "-l", "NULL");
也可以加載自己寫的可執行程序
?