在前面的章節(jié)我們了解到,進(jìn)程之間是有關(guān)聯(lián)的:
本章我們將了解:
?
一 終端登錄(Terminal Logins)BSD Terminal Logins?BSD終端的登錄程序在過去35年都沒有改變。
?上面的流程如下圖所示:

由init進(jìn)程fork創(chuàng)建的進(jìn)程的real user ID為0,effective user ID為0,并且他們都有超級用戶權(quán)限。
程序getty的職責(zé):為終端設(shè)備調(diào)用open函數(shù),一旦設(shè)備被打開,文件描述符0,1,2被設(shè)置給該設(shè)備。然后getty輸出一些提示符,等待我們輸入用戶名。當(dāng)我們輸入用戶名后,getty的工作就完成了,然后通過調(diào)用exec函數(shù)執(zhí)行登錄函數(shù),如下。
execle(“/bin/login”, “l(fā)ogin”, “-p”, username, (char *)0, envp);
增加了login程序后,流程如下圖所示:

上圖中fork出來的進(jìn)程都有超級用戶權(quán)限,因?yàn)樗麄兌际菑膇nit進(jìn)程fork出來,而init進(jìn)程有超級用戶權(quán)限。
下面的進(jìn)程的進(jìn)程ID都是相同的,因?yàn)閑xec函數(shù)不改變進(jìn)程的ID,并且他們的父進(jìn)程的ID都是1。
現(xiàn)在登錄程序轉(zhuǎn)到login程序執(zhí)行,login程序會做下面的事情:
如果我們正確登錄,則login程序會繼續(xù)做下面的事情:
?過程如下圖所示:

我們的shell已經(jīng)啟動后,會去讀取啟動文件(.profile或.bash_profile或.bash_login或.profile,不同的系統(tǒng)啟動文件的命名不同)。這些啟動文件的作用是增加系統(tǒng)的環(huán)境變量,設(shè)置一些全局變量,鏈接等。
?
2 網(wǎng)絡(luò)登錄(Network Logins)物理登錄和網(wǎng)絡(luò)登錄的區(qū)別在于:登錄終端到主機(jī)的連接是否是點(diǎn)對點(diǎn)的。
網(wǎng)絡(luò)登錄情況下,登錄是一種可用服務(wù),就像其他的服務(wù),如FTP或SMTP。
網(wǎng)絡(luò)登錄服務(wù)特點(diǎn)是不知道會有多少登錄請求會來。所以內(nèi)核不是在等待每一個可能的登錄,而是通過網(wǎng)絡(luò)接口驅(qū)動(network interface drivers)在等待一個網(wǎng)絡(luò)連接登錄請求。
為了統(tǒng)一處理物理登錄和網(wǎng)絡(luò)登錄,一個軟件驅(qū)動,叫做虛擬終端(pseudo terminal)被用來用將網(wǎng)絡(luò)登錄后的行為請求映射為真實(shí)終端的行為。
BSD Network Logins進(jìn)程inetd等待處理大部分的網(wǎng)絡(luò)連接。
下面我們將了解網(wǎng)絡(luò)登錄的過程。
啟動telnetd程序的過程如下圖所示:
?
telnetd進(jìn)程啟動后的動作為:
過程如下圖所示:

?
?3 進(jìn)程組(Process Groups)每一個進(jìn)程都屬于一個進(jìn)程組。
進(jìn)程組是一些進(jìn)程的集合,這些進(jìn)程常常關(guān)聯(lián)于同一個job,并且從同一個終端接收信號。
每一個進(jìn)程組都有一個唯一的進(jìn)程組ID。
函數(shù)getpgrp返回調(diào)用進(jìn)程的進(jìn)程組ID。
函數(shù)聲明:
?#include <unistd.h>
pid_t getpgrp(void);
? ? ? ? // Returns: process group ID of calling process
?
pid_t getpgid(pid_t pid);
? ? ? ? // Returns: process group ID if OK, -1 on error
函數(shù)調(diào)用getpgid(0); 和函數(shù)調(diào)用getpgrp(); 作用相同,都返回調(diào)用進(jìn)程的進(jìn)程組ID。
每個進(jìn)程組都有個頭進(jìn)程,該進(jìn)程的進(jìn)程ID和進(jìn)程組ID相同。
進(jìn)程組的生命周期:從一個進(jìn)程創(chuàng)建一個組開始,只到最有一個組內(nèi)進(jìn)程終止或者成為另外一個組的進(jìn)程為止。
一個進(jìn)程可以調(diào)用函數(shù)setpgid加入到另一個進(jìn)程組或者創(chuàng)建一個進(jìn)程組。
函數(shù)聲明:
?#include <unistd.h>
int setpgid(pid_t pid, pid_t pgid);
函數(shù)設(shè)置進(jìn)程ID為pid的進(jìn)程的進(jìn)程組ID為pgid。
如果pid和pgid相同,都為某個進(jìn)程的進(jìn)程ID,則進(jìn)程pid成為一個進(jìn)程組的頭進(jìn)程。
如果pid為0,則表示待設(shè)置的進(jìn)程為當(dāng)前進(jìn)程。
?
4 Sessions一個session是一個或幾個進(jìn)程組的集合。
例如下圖所示:

一個進(jìn)程通過調(diào)用函數(shù)setsid創(chuàng)建一個新的session。
函數(shù)聲明:
?#include <unistd.h>
pid_t setsid(void);
? ? ? ? // Returns: process group ID if OK, -1 on error
如果調(diào)用進(jìn)程不是組頭進(jìn)程,則會發(fā)生三件事:
函數(shù)getsid返回一個session leader進(jìn)程的進(jìn)程組ID。
函數(shù)聲明:
#include <unistd.h>
pid_t getsid(pid_t pid);
? ? ? ? // Returns: session leader’s process group ID if OK, -1 on error
如果pid為0,函數(shù)getsid返回調(diào)用進(jìn)程所在的session leader進(jìn)程的進(jìn)程組號。
?
?
參考資料:
《Advanced Programming in the UNIX Envinronment 3rd》
?
新聞熱點(diǎn)
疑難解答