目录
会话
会话这个名词在百度百科的解释是:
会话是指一个终端用户与交互系统进行通讯的过程。
但是笔者认为这个解释太过抽象了。后来有查看了sparkdev的博文。他给的解释比较形象:
我们常见的Linux session一般是指shell session。Shell session 是终端中当前的状态,在终端中只能有一个 session。当我们打开一个新的终端时,总会创建一个新的 shell session。这表明会话是我们和shell交互的一个过程。
站在进程的角度看:会话可以看成是一个或多个进程的集合。开始于用户登录,终止于用户退出。期间所有进程都属于这个会话期。
图中的安排可能如下:
proc1|proc2 &
proc3|proc4|proc5
创建会话
进程调用setsid
函数建立一个新会话:
#include <unistd.h>
pid_t setsid(void); //成功返回进程组ID,出错返回-1
如果调用此函数的进程不是一个进程组的组长进程,那么将会发生以下三件事:
- 该进程成为新会话的首进程(创建会话的进程)
- 该进程成为一个新进程组的组长进程
- 新会话丢弃原有控制终端,该进程没有控制终端
当然,如果该进程是组长进程,此函数会出错。
为了保证函数不会出错,一般使用以下技巧:
int main()
{
pid_t pid;
if((pid = fork()) < 0)
{
//fork error
}
else if(pid == 0)
{
setsid();
//子进程代码
}
else
{
exit(0);
}
}
因为子进程继承了父进程的进程组ID,而其进程ID是新分配的,这就保证了子进程不会是组长进程。
获取会话首进程的进程组ID
#include <unistd.h>
pid_t getsid(pid_t pid); //成功返回会话首进程的进程组ID,出错返回-1
参考文献
[1] UNIX环境高级编程(第二版)
[2]sparkdev.Linux session.