1. session是一系列進程的集合。這些進程的sid是相同的。注意,它就是一個集合!僅僅是一個集合!不要賦予其過多的意義,由於那樣是錯誤的。shell
2. session不是進程,它是一組進程的集合 。session leader是進程,並且其pid等於sid。bash
3. session也不等價於一個shell會話。任何一個進程,當它成功setsid後,一個新的session就被創建了,該進程就是session leader. 典型的例子就是Linux系統上的daemon。
session
4. 一個session中的進程是樹狀結構。一個session中的進程,必定是session leader或者其子孫進程。好比,若是A進程是一個session的session leader,那麼同在這個session中的B進程,必定是A進程的子進程或者子進程的子進程(以此類推)。緣由是,setsid這個調用是不接受參數的,即session號由系統分配。好比一個不是A子孫進程的進程C想要把本身的session號設置成和A同樣,這是不可能的,由於A所處的session尚未消亡,系統不會把這個號分配給C。spa
5. session什麼時候消亡?全部session中的進程都結束時消亡。即,全部有這個sid號的進程執行結束。這種執行結束分爲被動和主動兩種。session leader退出(或者結束)時,session中的進車會收到SIGHUP信號,默認結束掉進程。若是該進程對SIGHUP作了處理,不結束,那麼會受到SIGCONT信號,讓進程正常執行完畢。網上有些文章把bash敲exit退出和直接被結束做爲session消亡時的兩種狀況,這種就是典型的徹底沒搞清概念,從現象去套模糊的概念而總結出來的「規律」,害人害己。bash敲exit退出時,bash還沒退出,它做爲一個session leader沒有退出!敲exit時,bash的行爲,徹底由bash代碼決定!bash被強制退出(好比被kill掉),那麼它做爲一個session leader就結束了,系統纔會有以上的SIGHUP/SIGCONT的一些行爲。進程
以上就是Linux中session的一個基本概念。尤爲注意的是不要把session和bash,shell,X session這個概念混淆。it