1. session是一系列进程的集合。这些进程的sid是相同的。注意,它就是一个集合!仅仅是一个集合!不要赋予其过多的意义,因为那样是错误的。
2. session不是进程,它是一组进程的集合 。session leader是进程,而且其pid等于sid。
3. session也不等价于一个shell会话。任何一个进程,当它成功setsid后,一个新的session就被建立了,该进程就是session leader. 典型的例子就是Linux系统上的daemon。
4. 一个session中的进程是树状结构。一个session中的进程,一定是session leader或者其子孙进程。比如,如果A进程是一个session的session leader,那么同在这个session中的B进程,一定是A进程的子进程或者子进程的子进程(以此类推)。原因是,setsid这个调用是不接受参数的,即session号由系统分配。比如一个不是A子孙进程的进程C想要把自己的session号设置成和A一样,这是不可能的,因为A所处的session还没有消亡,系统不会把这个号分配给C。
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这个概念混淆。