1. 會話的基本概念
前面已經學過,程序組是一個或多個程序的集合。而會話(session),是一個或多個程序組的集合。建立程序組的程序,是程序組組長,而建立會話的程序,是會話長,通常我們不說會話長,而是稱其為會話首程序,用英文其實更加确切——session leader.
圖 1 展示了一個會話。
圖1 程序組和會話中的程序安排
圖 1 中的會話,可以使用以下指令形成:
$ cat | cat &
$ cat | cat | cat
可以使用指令
ps ajx | sed '1p;/cat$/!d'
檢視結果:
圖1 檢視 cat 程序
從圖1 中可以看到所有的 cat 程序都同屬一個會話 2391. 接下來,使用指令
ps ajx | sed '1p;/2391/!d'
檢視該會話中的所有程序,如果圖 2 所示。
圖2 會話 2391 中的所有程序
圖 2 中可以看到會話 2391 下面有 6 個程序,三個程序組(2391,6173,6176),其中 session leader 是 bash 程序,它是該會話的建立者,這也正是在前面的博文中提到可以視一個終端為一個會話的原因。
另外注意到程序 6475,也就是執行 ps 那一條複合指令的程序,它不屬于會話 2391,而是屬于會話 5653 中。因為這條指令是在另一個終端中執行的。
2. 建立會話
2.1 函數 setsid
函數
pid_t setsid(void)
可以用來建立一個新會話。需要注意的是,調用此函數的程序不能是程序組組長,否則會失敗。
如果調用者調用該函數,調用者程序就會建立新的會話,這将發生下面 3 件事:
- (1) 該程序變成新會話的 session leader,此時,該程序是新會話中的唯一程序。
- (2) 該程序成為新程序組的組長。也即新程序組 id 等于該程序 id.
- (3) 該程序沒有控制終端(控制終端的概念後面會說)。如果在調用 setsid 之前該程序有一個控制終端,那麼這種聯系也被切斷。
2.2 函數 getsid
3. 總結
- 了解什麼是會話
- 知道如何建立會話