UNIX高階環境程式設計 第8章 程序控制

2021-09-18 00:11:33 字數 3187 閱讀 3091

id0的程序通常是排程程序(交換程序),屬於核心的一部分。

id1的程序是init程序,在自舉過程結束時由核心呼叫,該程序讀寫系統初始化檔案,將系統引導至乙個狀態(如多使用者)。 它是乙個普通使用者程序,但以超級使用者特權執行。

函式宣告:

#include pid_t fork();
特性子程序的繼承特性正常終止異常終止

程序終止時保留的資源

殭屍程序

子程序終止,但父程序沒有利用wait或waitpid獲取子程序終止狀態

避免出現殭屍程序的方法:

---1. 用wait或waitpid**終止程序的資源

---2. 編寫如下**

int main()

}exit(0);

}if (wait(null) != pid1)

err_sys("wait err.");

while(1)

exit(0);

}

**示意圖child1提前終止時,child2的父程序變成了init,當child2終止時,init呼叫wait**殭屍程序的資源

pid_t wait(int *status);

pid_t waitpid(pid_t pid, int *status, int options);

pid:---1. pid == -1 ,等待任意程序---2. pid > 0 , 等待程序pid---3. pid == 0 , 等待本程序組的任意程序---4. pid < -1, 等待組id等於pid絕對值的任一程序

option:

---1. wnothang 沒有程序報告狀態則立即返回

---2. wcontinued

---3. wuntraced 子程序由於sigttin、sigttou、sigtstp或sigstop訊號進入暫停狀態

返回值

wait: 唯一的出錯是程序沒有子程序,errno = echild

waitpid: 指定的程序或程序組不存在或沒有許可權呼叫,則會出錯

六個exec最終呼叫execve函式

基本的程序控制原語: fork, exec, wait, exit

execl execle execlp的命令列引數格式:

char* arg0, char* arg1, ..., char* argn, (char*)0

新程式從呼叫程序繼承的屬性:

程序id和父程序id

實際使用者id和實際組id注意:suid沒有繼承

新增組id

程序組id

對話期id

控制終端

當前工作目錄

根目錄

資源限制

鬧鐘尚餘留的時間

檔案方式建立遮蔽字

檔案鎖

程序訊號遮蔽

未決訊號

tms_utime, tms_stime, tms_cutime以及tms_ustime值

ruid、euid、suid轉換

Unix程式設計第7章 程序環境

準備雄心勃勃的看完apue,但是總感覺看著看著就像進入一本字典,很多地方都是介紹函式的用法的,但是給出例子遠不及函式介紹的多。而且這本書還是個大部頭呢。第7章的講的程序環境,程序是程式設計中乙個比較重要的概念,知道倒是知道它的大概意思,但是其實還是有很多的細節其實都沒有深究,這章呢apue就帶著我們...

UNIX高階環境程式設計 第13章 守護程序

守護程序 沒有控制終端,長期執行在後台的程序 void daemonize const char cmd else if pid 0 呼叫setsid以建立乙個新會話 使呼叫程序 a.成為新會話的首程序,b.成為乙個新程序組的組長程序,c.沒有控制終端。setsid struct sigaction...

第7章 程序環境

main函式之前會有乙個特殊的啟動程式,啟動例程從核心取得命令列引數和環境變數。正常終止 從main函式返回 呼叫exit 呼叫 exit或 exit 最後乙個執行緒從啟動例程返回 最後乙個執行緒呼叫pthread exit 異常終止 呼叫abort 接到乙個訊號終止 最後乙個執行緒對取消請求作出相...