对 Linux会话(Linux session)的理解
会话是由一个或多个进程组 组成的。如下图所示,一个会话中由三个进程组。
会话是由进程组中第一个进程创建出来的(即领头进程<进程组组长>)
会话中的领头进程ID(PID)也是会话的ID(SID).
一般情况下,一个进程中称为一个job,其中一个为前台运行的job,他直接可以收到终端的输入
并且把结果输出到该终端。其他的job则后台运行。
一般情况下,会话和命令行终端是一一对应的,打开多个命令行终端窗口,实际就创建了多个会话。
调用setsid函数建立一个新的会话
注意:
调用setsid成功之后的进程会没有控制终端。
如果调用该函数的进程已经是领头进程了,则该函数会出错返回。为了确保不会出现这种错误情况。
会先调用fork函数之后让父进程终止,让子进程继承了本来是父进程的进程组组ID,
而且自己的PID新配备的,不是领头进程,那么调用setsid创建新的会话之后,进程组ID则是子进程的ID.
子进程就会变成该会话的领头进程.
获取会话首进程的进程组ID — getsid
如果pid为0的话,getsid则会返回调用进程的会话首进程的进程组ID。
如果PID并不属于调用者所在的会话,那么是不能返回会话受进程的进程组ID