linux session 浅谈

今天我来谈一谈关于linux session的一些认识,以下都是我对这个概念的认识,只是很初级的,希望对各位有所帮组吧。
  • session的概念:

在web中的session概念,维系是基于凭证,在web中一般用session保存的是登录的信息,当客户端每次进行请求的时候,都会在请求的数据后面加上session ,这样

服务端就可以知道该用户是什么用户,以及他所具有的权限。当用户退出,或长时间没有交互,则session无效(该凭证已经失效),需要重新登录。


linux中的session跟这个有点类似,也是在一个用户登录到主机,那么就建立了一个session,但是它的维系是基于连接的,那么该对于这个会话存在两种的维持方法

1. 本地连接:就是说用户是在主机本机上进行的登录,直接通过键盘和屏幕和主机进行交互。

2. 远程连接:用户通过互联网进行连接,比如基于ssh,连接都是经过加密的。



session是一个或多个进程组的集合。



  • session的创建:

创建有两种方法:


1. 用户登录就是一个会话的开始,登录之后,用户会得到一个与终端相关联的进程,该进程就是该会话的leader,会话的id就是该进程的id。

2. 是在程序中调用pid_t setsid(void),如果调用此函数的进程不是一个进程组的组长,则此函数就会创建一个新的会话,它将做以下三件事:

a. 该进程是新会话的首进程(session leader),也是该会话中唯一的进程;

b. 该进程成为一个新进程组的组长进程,新进程组id是该进程id;

c. 该进程是没有控制终端的。如果该进程原来是有一个控制中断的,但是这种联系也会被打断。因此呢,我们在新建一个session的时候就要记得对输入输出进程重定向哦。

在调用setsid()的时候呢,要注意如果caller process是进程组组长,那么函数将会返回出错哦,所以一般偶是先fork一个进程后,在调用该函数,保证了caller process不是进程组组长哦。
  • session的退出:
对于session的退出会进行很多的操作,且听我慢慢说来:

当session 中leader进程退出,将导致它所连接终端被hangup,这就意味着该会话结束。如果是像ssh这种远程连接,可以通过断开网络连接来使(伪)终端hangup,这将使得leader进程收到SIGHUP信号而退出。如果是pty,其本身就是随着会话建立而创建的,会话结束,那么该终端也会被销毁的。而如果是tty则不会,因为该设备是在系统初始化的时候创建的(请看前一篇博客),并不是依赖该会话建立的,所以当该会话退出,tty仍然是存在的。只是init进程在会话结束后,就会重启getty来监听该tty。


但是对于会话的结束,并不会意味着该会话的所以进程都结束。


对于daemon进程,在会话中创建,但是不依赖于会话,是常驻在后台的进程。


具体来说当终端hangup时候,内核会有如下两个动作:


1. 想对应会话的leader进程发送SIGHUP信号,一般来说leader是一个shell,它收到SIGHUP信号后并不是马上退出,而hi想他启动的子进程都各自发送一个SIGHUP,将他们都杀死后,自己才退出,但是如果当该leader进程主动退出,而导致的终端hangup那么就不会发送SIGHUP信号给子进程了。

2. 因为session都将消亡了,那么它将控制终端修改为不可读不可写的文件。所以呢,会话退出后没有消亡的进程是不能控制终端的。


如果又想要某个进程称为常驻后台进程,不随session退出而退出,有下面几个方法:


1. 避免shell发送SIGHUP信号: a. 主动调用exit,而不是直接断开终端;b. 两次fork,因为shell只给子进程发送SIGHUP信号,不给孙进程发送。

2. 忽略SIGHUP信号:进程捕捉到该信号将该信号忽略就行了。

3. 通过上面说到的setsid()系统调用,那么该调用进程将会退出该session而建立一个新的session。



展开阅读全文

没有更多推荐了,返回首页