linux進程組會話控制終端 一個進程可以通過fork()調用建立子進程,這些進程就可以構成一個進程組。 www.2cto.com 進程組 --------------------------------------------- 進程組是一個或多個進程的集合。每個進程組有一個稱為組長的進程,組長進程就是其進程號(pid)等於進程組號(gid)的進程(即進程組號等於組長的進程號)。進程組的概念有很多用途,最常見的是我們在終端上向前台執行程式發出終止訊號(Ctrl-C),同時終止整個進程組的所有進程。 (1). Shell上的一條命令列形成一個進程組 (2). 每個進程屬於一個進程組 (3). 每個進程組有一個領頭進程(組長) (4). 進程組的生命週期到組中最後一個進程終止, 或加入其他進程組為止 (5). getpgrp: 獲得進程組id, 即領頭進程的pid (6). 前台進程組和後台進程組 (7). 進程A(假設該進程為組長)和其子進程B屬於同一進程組,它們的進程組號(task_struct.gid)都為進程A的進程號(A.pid) 會話 www.2cto.com --------------------------------------------- 會話期(Session,或者稱為會話)則是一個或多個進程組的集合。通常情況下,使用者登入後所執行的所有程式都屬於一個會話期,而其登入shell則是會話期首進程(Session leader),並且它所使用的中斷就是會話期的控制終端(Controlling Terminal),因此會話期的首進程通常也被稱為控制進程(Controlling process)。當我們退出登入(logout)時,所有屬於這個會話期的進程都將被終止。 (1). 一次登入形成一個會話 (2). 一個會話可包含多個進程組, 但只能有一個前台進程組. (3). setsid()可建立一個新的會話;如果調用該函數的進程不是進程組的領頭進程, 該函數才能建立新的會話. 調用setsid()之後, 調用進程將成為新會話的領頭進程. 控制終端 --------------------------------------------- (1) 會話的領頭進程開啟一個終端之後, 該終端就成為該會話的控制終端 (SVR4/Linux) (2) 與控制終端建立串連的會話領頭進程稱為控制進程 (session leader) (3) 一個會話只能有一個控制終端 (4) 產生在控制終端上的輸入和訊號將發送給會話的前台進程組中的所有進程 (5) 終端上的串連斷開時(比如網路斷開或Modem斷開), 掛起訊號將發送到控制進程(session leader)