id
為0
的程序通常是排程程序(交換程序),屬於核心的一部分。
id
為1
的程序是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 接到乙個訊號終止 最後乙個執行緒對取消請求作出相...