天天看點

67-會話

1. 會話的基本概念

前面已經學過,程序組是一個或多個程序的集合。而會話(session),是一個或多個程序組的集合。建立程序組的程序,是程序組組長,而建立會話的程序,是會話長,通常我們不說會話長,而是稱其為會話首程序,用英文其實更加确切——session leader.

圖 1 展示了一個會話。

67-會話

圖1 程序組和會話中的程序安排

圖 1 中的會話,可以使用以下指令形成:

$ cat | cat &
$ cat | cat | cat      

可以使用指令 ​

​ps ajx | sed '1p;/cat$/!d'​

​ 檢視結果:

67-會話

圖1 檢視 cat 程序

從圖1 中可以看到所有的 cat 程序都同屬一個會話 2391. 接下來,使用指令 ​

​ps ajx | sed '1p;/2391/!d'​

​ 檢視該會話中的所有程序,如果圖 2 所示。

67-會話

圖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. 總結

  • 了解什麼是會話
  • 知道如何建立會話

繼續閱讀