天天看點

《APUE》讀書筆記—第九章程序關系

 本章看後給人似懂非懂的感覺,主要是不知道實際當中如何去使用。通過前面幾章的學習,每個程序都有一個父程序,當子程序終止時,父程序得到通知并取得子程序的退出狀态。先将本章基本的知識點總結如下,日後再看時候好好總結一下。

1、終端登入

  介紹了有終端登入unix系統的過程。通過init程序讀檔案/etc/ttys,fork一個子程序調用exec執行getty程式進行登入,當使用者輸入完使用者名後,getty的工作完成了,然後調用login程式,類似execle("/bin/login","login","-p",username,(char *)0,envp)。

2、網絡登入

  經由核心的網絡接口驅動程式,使用僞終端驅動程式,bsd中由inetd程序等待網絡連接配接。具體過程為:inti程序調用一個shell,啟動守護程序inetd,等待tcp/ip連接配接請求達到主機,當一個連接配接請求到達時,fork一個子程序進行執行相關程式。

3、程序組

  每個程序除了擁有一個程序id外,還屬于一個程序組,程序組是一個或多個程序的集合,每個程序組有一個唯一的程序組id,可以通過getpgrp函數擷取。每個程序組可以有一個組長程序,其程序組id等于其程序id。組長程序可以建立一個程序組,建立改組中的程序。通過setpgid函數添加一個現有的組或者建立一個新程序組。

4、會話

  會話(session)是一個或者多個程序組的集合,通常是由shell的管道線将幾個程序程式設計一組。程序調用setsid函數建立一個新會話,getsid函數傳回調用程序的會話首程序的程序組id。

5、控制終端

  一個會話可以用一個控制終端;建立與控制終端連接配接的會話首程序稱為控制程序;一個會話中的幾個程序組可以分為前台程序組和背景程序組;一個會話中隻有一個前台程序組,但可以有多個背景程序組;中斷(ctrl+c,sigint)、退出(ctrl+/,sigquit)和挂起(ctrl+z,sigtstp)字元産生的信号發送到前台程序組。

6、作業控制

  在一個終端上啟動多個作業(程序組),控制作業在前背景運作。作業控制需要3個方面的支援和協作:(1)shell本身的支援;(2)核心的終端驅動程式的支援;(3)核心對作業控制信号的支援。

7、shell執行程式

  采用ps指令輸出程序id,父程序id,程序組id,會話id,指令。

      ps -o pid,ppid,pgid,sid,comm

8、孤兒程序組

  一個父程序已經終止的程序稱為孤兒程序(orphan process),這種程序由init程序收養。當一個控制程序結束後,其控制終端也會被釋放,其他的session可以使用該終端作為控制終端。為了防止舊session中的程序嘗試繼續使用該終端,提出了孤兒程序組的概念。孤兒程序組就是指那些session leader已經終止,卻還在繼續執行的程序組。當程序組成為孤兒程序組時,核心會發送sighup信号到該程序組中的所有程序。對于sighup信号,預設情況下是終止程序。但使用者可以捕捉此信号,進而不被終止,但是還是不能通路終端。孤兒程序組定義:改組中每個成員的父程序要麼是該組的一個成員,要麼不是該組所屬會話的成員。一個程序組不是孤兒程序組的條件是:該組有一個程序,它的父程序在屬于同一會話的另一個組中。

建立一個孤兒程序組程式如下:

《APUE》讀書筆記—第九章程式關系
《APUE》讀書筆記—第九章程式關系

執行結果如下:

《APUE》讀書筆記—第九章程式關系

補充一下:

pid = 程序id (由核心根據延遲重用算法生成)

ppid = 父程序id(隻能由核心修改)

pgid = 程序組id(子程序、父程序都能修改)

sid = 會話id(程序自身可以修改,但有限制,詳見下文)

tpgid= 控制終端程序組id(由控制終端修改,用于訓示目前前台程序組)

僵屍程序:先于父程序終止,但是父程序沒有對其進行善後處理(擷取終止子程序有關資訊,釋放它仍占有的資源)。消滅僵屍程序的唯一方法是終止其父程序。

孤兒程序:該程序的父程序先于自身終止。其特點是ppid=1(init程序的id)。一個孤兒程序可以自成孤兒程序組。

程序屬于一個程序組,程序組屬于一個會話,會話可能有也可能沒有控制終端

上一篇: fork函數總結
下一篇: <h1>cccccc

繼續閱讀