exec用被執行的程式完全替換呼叫它的程式的影像。fork建立乙個新的程序就產生了乙個新的pid,exec啟動乙個新程式,替換原有的程序,因此這個新的被exec執行的程序的pid不會改變,和呼叫exec函式的程序一樣。
下面來看下exec函式族:
#include std.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);
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。
Linux下C語言程式設計
include include include include define max 10pthread t thread 2 pthread mutex t mut int number 0 i void thread1 printf thread1 主函式在等我完成任務嗎?n pthread e...
Linux 下C語言程式設計
linux 下c語言程式設計 1.程式設計的概念和理解 1.1程式編譯的過程 在這一操作中,程式完成了複雜的過程。乙個程式的編譯,需要完成詞法分析 語法分析 中間 生成 優化 目標 生成。l 詞法分析 指的是對由字元組成的單詞進行處理,從左至右逐個字元地對源程式進行掃瞄,產生乙個個單詞符號。然後把字...
Linux下C語言程式設計概述
linux下的c語言程式設計與在其他環境中的c程式設計一樣,主要涉及到編輯器 編譯鏈結器 偵錯程式及專案管理工具。本篇內容屬於嵌入式學院 嵌入式工程師職業培訓班 一期課程中linux作業系統中的部分內容,這裡我們先對這4種工具進行一下簡單介紹。1 編輯器 linux下的編輯器就如windows下的w...