exec系函數
Posix標准制定的exec系列的函數主要有六個,它們的聲明新式如下:
- 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 execvpe(const char *file, char *const argv[],
- char *const envp[]);
這些函數的作用是利用一個新的進程鏡像(process image)來替代當前的進程鏡像。
主要說明一下execlp函數,它的第一個參數file用於制定可執行的文件名,第二個參數arg以及後面的可變參都是傳遞給該可執行文件的參數,由於是可變參數,所以最後一個參數必須以(char*)NULL結尾。該函數如果成功執行,由於是替代當前的進程,所以函數調用語句之後的代碼就不會再被執行了。
這裡需要注意的是傳遞的參數,一般情況下,execlp函數的前兩個參數一樣,都是可執行文件名。我們考慮帶參數的main函數的執行情況,argv[0]指代的實際上是可執行文件名,其後的argv[1]~~argv[n]才是真正傳遞給它的參數。所以為了保持一致性,由於arg參數以及其後的可變參才是傳遞給執行程序的參數,所以,arg參數最好傳遞可執行文件的名字,就是是和file參數保持一致。
進程時間
linux下獲取的進程時間主要分為以下三類:時鐘時間(clock time),用戶CUP時間(user CPU time),系統CPU時間(system CPU time)
在說它們之間的區別,我們首先來回顧下進程的三種基本狀態:運行,就緒,阻塞。所謂時鐘時間其實就是進程從執行開始到結束真實經歷的時間,所以:
時鐘時間 = 阻塞時間 + 就緒時間 + 運行時間
而我們知道進程的執行分為管態和目態,前者是內核調用函數執行的狀態,後者則是用戶代碼執行時的狀態,所以:
用戶CPU時間 = 運行狀態下的用戶空間時間
系統CPU時間 = 運行狀態下系統空間的時間
Linux運行環境限制
unix中有以下三種限制:
(1)編譯時限制(頭文件)
(2)不與文件或目錄相關聯的運行時限制(sysconf函數)
(3)與文件或目錄相關聯的運行時限制(pathconf函數和fpahtconf函數
第一種是屬於編譯時限制,這類限制一般都作為宏定義在頭文件中,例如CHAR_MAX等,關鍵是後兩種限制,它們屬於運行時的環境限制,需要使用以下三種函數進行檢測:
- long sysconf(int name);
- long pathconf(const char *pathname, int name);
- long fpathname(int filedes, int name);
它們是用來檢測linux運行環境的限制的,成功返回響應值,出錯則返回-1。
第一個函數是檢測不與文件或目錄相關聯的運行時限制,例如OPEN_MAX,它返回用戶可打開文件的最大數量。
而後兩個函數則是分別用於檢測與目錄或文件相關聯的運行時限制,例如LINK_MAX,它返回文件鏈接數的最大值。