linux系統原語



一、進程控制原語:
1、進程創建:fork
格式:pid = int fork()
fork調用返回時,系統中已有兩個用戶級環境完成相同的進程存在,這兩個進程從fork調用中得到的返回值不同,其中子進程得到的返回值爲0,父進程得到的返回值是新創建子進程的進程標識號,子進程得到是0。


2、系統調用:exec函數族
格式:
#include <unistd.h>
int execl (const char*pathname, const char* arg0,………/*(char*)0*/);
int execv (const char* pathname,char* const argv[]);
函數execl和execv的區別與參數表的傳遞有關(l表示list,v表示vector)


int execve (const char*pathname, char* const argv[], const char* envp[]);
execve函數加載並運行可執行目標文件pathname,且帶參數列表argv和環境變量列表envp。
參數列表argv指向一個以null結尾的指針數組,其中每個指針都指向一個參數串。按照慣例,argv[0]是可執行目標文件的名字。


當進程調用一種exec函數時,該進程執行的程序完全替換爲新程序。因爲調用exec並不創建新進程,所以前後的進程ID並未改變。exec只是用一個全新的程序替換了當前進程的正文、數據、堆和棧段。


3、系統調用終止進程執行:exit


僵死進程:一個已經終止,但是其父進程尚未對其進行善後處理(獲取終止子進程的終止狀態信息,釋放它佔用的資源)的進程被稱爲僵死進程(zombie)


防止僵死進程
有效方式1:父進程調用sigaction函數綁定信號SIGCHLD的信號處理函數時,把其選項字段設置爲SA_NOCLDWAIT,則可防止僵死子進程。(子進程終止後,內核自動把其終止狀態信息丟棄)父進程可隨時結束,不必等到所有子進程終止。  詳情見UNIX信號博文
有效方式2:調用fork兩次以避免僵死進程。


4、系統調用等待子進程暫停或終止:wait
當一個進程正常或異常終止時,內核就向其父進程發送SIGCHLD信號。
#include <sys/wait.h>
pid_t wait(int *statloc) ;           // statloc爲返回的終止狀態存放處
pid_t waitpid(pid_t pid, int *statloc, int options) ;
父進程調用這兩個函數,只要一有子進程終止,則此函數就取得該子進程的終止狀態立即返回。否則一直阻塞。(若它沒有任何子進程,則立即出錯返回)
這兩個函數的區別:
①  在一個子進程終止前,wait使其調用者阻塞,而waitpid則有一個選項,可使調用者不阻塞。(options設置爲WNOHANG)
②  wait只獲取在其調用之後的第一個終止子進程,而waitpid則有參數,可控制它所等待的進程。(pid設置爲不同的值,有不同的含義。)


5、在程序中執行一個命令字符串:system
#include <stdlib.h>
int  system(constchar * cmdstring);
(其效果相當於在控制檯輸入命令,這樣,可以讓我們在程序中用到shell命令)
system函數在實現中調用了fork、exec和waitpid。

使用system而不是直接使用fork和exec的優點是:system進行了所需的各種出錯處理以及各種信號處理。(故:忘掉exec函數吧,雖然它有更強大的功能,但一般用system函數足矣。)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章