在前面的章節我們了解到,進程之間是有關聯的:
本章我們將了解:
?
一 終端登錄(Terminal Logins)BSD Terminal Logins?BSD終端的登錄程序在過去35年都沒有改變。
?上面的流程如下圖所示:
由init進程fork創建的進程的real user ID為0,effective user ID為0,并且他們都有超級用戶權限。
程序getty的職責:為終端設備調用open函數,一旦設備被打開,文件描述符0,1,2被設置給該設備。然后getty輸出一些提示符,等待我們輸入用戶名。當我們輸入用戶名后,getty的工作就完成了,然后通過調用exec函數執行登錄函數,如下。
execle(“/bin/login”, “login”, “-p”, username, (char *)0, envp);
增加了login程序后,流程如下圖所示:
上圖中fork出來的進程都有超級用戶權限,因為他們都是從init進程fork出來,而init進程有超級用戶權限。
下面的進程的進程ID都是相同的,因為exec函數不改變進程的ID,并且他們的父進程的ID都是1。
現在登錄程序轉到login程序執行,login程序會做下面的事情:
如果我們正確登錄,則login程序會繼續做下面的事情:
?過程如下圖所示:
我們的shell已經啟動后,會去讀取啟動文件(.profile或.bash_profile或.bash_login或.profile,不同的系統啟動文件的命名不同)。這些啟動文件的作用是增加系統的環境變量,設置一些全局變量,鏈接等。
?
2 網絡登錄(Network Logins)物理登錄和網絡登錄的區別在于:登錄終端到主機的連接是否是點對點的。
網絡登錄情況下,登錄是一種可用服務,就像其他的服務,如FTP或SMTP。
網絡登錄服務特點是不知道會有多少登錄請求會來。所以內核不是在等待每一個可能的登錄,而是通過網絡接口驅動(network interface drivers)在等待一個網絡連接登錄請求。
為了統一處理物理登錄和網絡登錄,一個軟件驅動,叫做虛擬終端(pseudo terminal)被用來用將網絡登錄后的行為請求映射為真實終端的行為。
BSD Network Logins進程inetd等待處理大部分的網絡連接。
下面我們將了解網絡登錄的過程。
啟動telnetd程序的過程如下圖所示:
?
telnetd進程啟動后的動作為:
過程如下圖所示:
?
?3 進程組(Process Groups)每一個進程都屬于一個進程組。
進程組是一些進程的集合,這些進程常常關聯于同一個job,并且從同一個終端接收信號。
每一個進程組都有一個唯一的進程組ID。
函數getpgrp返回調用進程的進程組ID。
函數聲明:
?#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
函數調用getpgid(0); 和函數調用getpgrp(); 作用相同,都返回調用進程的進程組ID。
每個進程組都有個頭進程,該進程的進程ID和進程組ID相同。
進程組的生命周期:從一個進程創建一個組開始,只到最有一個組內進程終止或者成為另外一個組的進程為止。
一個進程可以調用函數setpgid加入到另一個進程組或者創建一個進程組。
函數聲明:
?#include <unistd.h>
int setpgid(pid_t pid, pid_t pgid);
函數設置進程ID為pid的進程的進程組ID為pgid。
如果pid和pgid相同,都為某個進程的進程ID,則進程pid成為一個進程組的頭進程。
如果pid為0,則表示待設置的進程為當前進程。
?
4 Sessions一個session是一個或幾個進程組的集合。
例如下圖所示:
一個進程通過調用函數setsid創建一個新的session。
函數聲明:
?#include <unistd.h>
pid_t setsid(void);
? ? ? ? // Returns: process group ID if OK, -1 on error
如果調用進程不是組頭進程,則會發生三件事:
函數getsid返回一個session leader進程的進程組ID。
函數聲明:
#include <unistd.h>
pid_t getsid(pid_t pid);
? ? ? ? // Returns: session leader’s process group ID if OK, -1 on error
如果pid為0,函數getsid返回調用進程所在的session leader進程的進程組號。
?
?
參考資料:
《Advanced Programming in the UNIX Envinronment 3rd》
?
新聞熱點
疑難解答