linux系統原語

2021-07-06 07:14:30 字數 1736 閱讀 9679

一、程序控制原語:

1、程序建立:fork

格式:pid = int fork()

fork呼叫返回時,系統中已有兩個使用者級環境完成相同的程序存在,這兩個程序從fork呼叫中得到的返回值不同,其中子程序得到的返回值為0,父程序得到的返回值是新建立子程序的程序標識號,子程序得到是0。

2、系統呼叫:exec函式族

格式:#include

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

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

int  system(constchar * cmdstring);

(其效果相當於在控制台輸入命令,這樣,可以讓我們在程式中用到shell命令)

system函式在實現中呼叫了fork、exec和waitpid。

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

linux執行緒控制原語2

將單個執行緒退出 void pthread exit void retval 引數 retval表示執行緒退出狀態,通常傳null 思考 使用exit將指定執行緒退出,可以嗎?pthrd exit.c include include include include void tfn void arg...

作業系統PV原語練習(2)

題目描述 有乙個倉庫,可以存放a 和b 兩種產品,但要求 1 每次只能存入一種產品 a 或b 2 n a 產品數量 b 產品數量 m。其中,n 和m 是正整數。試用同步演算法描述產品a 與產品b 的入庫過程。思路如下 題目中沒有說倉庫的大小,假設預設是無限量 每次能存放乙個產品,互斥的訪問倉庫,設定...

作業系統 程序控制原語

為了實現程序控制,在作業系統核心中,有一組程式專門用於完成對程序的控制,這些原語至少需要包括建立新程序原語,阻塞程序原語,喚醒程序原語,終止程序原語,系統服務對使用者開放,即使用者可以通過相應的介面來使用它們。從pcb集合中申請乙個空白的pcb,將呼叫者引數 如程序外部識別符號,初始cpu狀態,程序...