09 程序關係

2022-08-13 12:33:18 字數 2455 閱讀 6143

1、終端登入

bsd終端登入

a、系統管理員建立通常名為/etc/ttys的檔案,其中,每個終端裝置都有一行,每一行說明裝置名和傳遞給getty程式的引數,例如,引數之一說明了終端的波特率等。

當程式自舉時,核心建立程序id為1的程序,也就是init程序。init程序使系統進入多使用者狀態。init程序讀檔案/etc/ttys,對每乙個允許登入的終端裝置,init呼叫一次fork,它所生成的子程序則執行(exec)getty程式。

fork and exec

init ------------------> getty    (現在為兩個程序,init為getty的父程序,兩個程序的實際使用者id和有效使用者id都為0)

b、getty為終端裝置呼叫open函式,以讀、寫方式將終端開啟。如果裝置是數據機,則open可能會在裝置終端驅動程式中滯留,直到使用者撥號數據機,並且呼叫並應答。一旦裝置被開啟,則檔案描述符0、1、2就被設定到該裝置。然後getty輸出"login:"之類的資訊並等待使用者鍵入使用者名稱。

當使用者鍵入了使用者名稱後,getty的工作就完成了。然後它以類似於下面的方式呼叫login程式:

execle("

/bin/login

","login

","-p

",username,(char *)0,envp);

init以乙個空環境呼叫getty。getty以終端名和在gettytab中說明的環境字串為login建立乙個環境(envp引數)。

fork and exec                exec

init ------------------> getty ----------------> login

注意,現在還是只有兩個程序,只不過之前的getty程序再次exec為login程序,getty和login程序id相同,因為程序id不會因執行exec而改變。並且,除了init程序,所有的父程序id都為1.

login能執行多項工作,因為它得到了使用者名稱,所以能呼叫getpwnam取得相應使用者的口令檔案登入項。然後呼叫getpass以顯示"password:",接著讀使用者鍵入的口令。如果使用者幾次鍵入的口令都無效,則login以引數1呼叫exit表示登入過程失敗。父程序init了解到子程序的終止情況後,將再次呼叫fork,其後接著執行getty,對此終端重複以上過程。如果口令正確,則login程序完成一些登入使用者的初始化工作,login程序的實際使用者id和有效使用者id改變為登入使用者的使用者id(setuid)並呼叫該使用者的登入shell。

c、到此為止,登入使用者的登入shell開始執行。其父程序id是init程序id(程序id為1),所以,當此登入shell終止時,init會得到通知(接到sigchld訊號),它會對該終端重複全部上述過程,將登入shell的檔案描述符0、1、2設定為終端裝置。

getty and login                    fd 0,1,2                                硬鏈結

init ---------------------> shell <------------------> 終端裝置驅動程式 <-------------> 終端使用者   

linux終端登入

與bsd終端登入類似,在linux中,/etc/inittab包含配置資訊,它說明了init應當為之啟動getty程序的各終端裝置。

2、程序組

每個程序除了有乙個程序id之外,還屬於乙個程序組。程序組是乙個或多個程序的集合。它們與同一作業相關聯。每個程序組有乙個唯一的程序組id。

通常是由shell的管道線將幾個程序編成一組的。如 proc1 | proc2 &。

每個程序組都可以有乙個組長程序,組長程序的標識是,其程序組id等於其程序id。

組長程序可以建立乙個程序組,建立該組中的程序,然後終止。只要在某個程序組中有乙個程序存在,則該程序組就存在,這與其組長程序是否終止無關。程序組中的最後乙個程序可以終止,或者轉移到另乙個程序組。

乙個程序只能為它自己或它的子程序設定程序組id。在它的子程序呼叫了exec函式之一後,它就不再能改變該子程序的程序組id。

在大多數作業控制shell中(注意,這裡提到作業控制shell,因為作業一般都與shell相關聯),在fork之後呼叫setpgid函式,使父程序設定其子程序的程序組id,並且使子程序設定其自己的程序組id。這兩個呼叫中有乙個是冗餘的,但讓父子程序都這麼做可以保證,在父、子程序認為子程序已進入了該程序組,這確實已經發生了。如果不這樣做的話,那麼fork之後,由於父、子程序執行先後次序的不確定,會造成在一段時間內(父、子程序只執行了其中乙個)子程序組員身份的不確定(取決於哪個程序首先執行),這就產生了競爭條件。

3、孤兒程序組

定義:該組中每個成員的父程序要麼是該組的乙個成員,要麼不是該組所屬會話的成員。

另一種描述:乙個程序組不是孤兒程序組的條件是,該組中有乙個程序,其父程序在屬於同一會話的另乙個組中。

Linux 09 程序管理

程序 作業系統中,每個執行的程式都稱為乙個程序,都分配乙個id號。每個程序,都會對應乙個父程序,而這個父程序可以複製多個子程序。每個程序都可能以兩種方式存在的。前台與後台,所謂前台程序就是使用者目前的螢幕上可以進行操作的。後台程序則是實際在操作,但由於螢幕上無法看到的程序,通常使用後台方式執行。服務...

Linux程序關係

linux的程序相互之間有一定的關係。比如說,在linux程序基礎中,我們看到,每個程序都有父程序,而所有的程序以init程序為根,形成乙個樹狀結構。我們在這裡講解程序組和會話,以便以更加豐富的方式了管理程序。每個程序都會屬於乙個程序組 process group 每個程序組中可以包含多個程序。程序...

Linux程序關係

linux的程序相互之間有一定的關係。比如說,在linux程序基礎中,我們看到,每個程序都有父程序,而所有的程序以init程序為根,形成乙個樹狀結構。我們在這裡講解程序組和會話,以便以更加豐富的方式了管理程序。每個程序都會屬於乙個程序組 process group 每個程序組中可以包含多個程序。程序...