关于unix系统编程中的session的理解

37 views
Skip to first unread message

Casa Zhang

unread,
Aug 20, 2013, 7:55:52 AM8/20/13
to sh...@googlegroups.com

linux中的session(会话)和终端有什么联系和区别?

书上说一个会话是进程组的集合,会话期是从用户登录到用户退出,但是网上有些博客说一个会话只有一个终端,但是用户登录之后是可以打开多个终端的,这点不是很理解

哪位大虾能解释一下?

AR (aka AleiPhoenix)

unread,
Aug 20, 2013, 9:44:01 PM8/20/13
to sh...@googlegroups.com
2013/8/20 Casa Zhang <zhangl...@gmail.com>

linux中的session(会话)和终端有什么联系和区别?

书上说一个会话是进程组的集合,会话期是从用户登录到用户退出,但是网上有些博客说一个会话只有一个终端,但是用户登录之后是可以打开多个终端的,这点不是很理解

哪本书?  OP说的「一个会话只有一个终端」,其实这里终端应该是控制终端吧。

后半句说的「用户登录之后是可以打开多个终端的」 在哪里打开的? tty ? 还是 X里的终端模拟器? 情况是不一样的, tty 就是建立一个新会话了。而 终端模拟器也类似。


碰巧以前研究daemon的时候看了一下 advanced programming in the unix enviroment 。

里面9.5节和9.6节是这么说的 摘自以前写的blog[1], 欢迎批评指正。

什么是会话(session)

总结引用自原书9.5 session

一般在进程建立新session的时候,会调用setsid()这个函数,它会有3个必要的步骤、特征

如果调用者(以下称为caller)是一个进程组的leader,那么调用会出错,(我们可以通过fork来避免,父进程退出,子进程继续运行)

关于进程组的leader,指的就是一系列PIPE或者FORK的第一个进程,例如cat foo | wc -l,这里2个进程一起被称作一个group,而cat是这个group的leader

caller本身称为一个session的leader(道理和group类似),也是这个新session里仅有的进程

caller本身也称为一个group的leader,group id 就是caller的PID

caller本身不会有controlling terminal,如果在setsid()之前就有controlling terminal,那么调用就会失败

关于controlliing terminal,可以参考下面的9.6



什么是控制终端(controlling terminal)

总结引用自原书9.6 controlling terminal

关于controlling terminal,有以下这些特征

一个session仅有一个终端,可以是真正的终端,也可以是伪终端(例如我们常在X11里用的终端模拟器)
建立到controlling terminal的进程叫做controlling process,通常是login shell(常见的例如/bin/bash --login)
在一个session里,进程组(group),可以分为一个前台组(foreground group)和若干个后台组(background group) (具体的可以参考unix-like系统的进程控制方面的解说)

如果有conrolling terminal的情况下,也最多只有一个前台组,其他都是后台组,如果要和controlling terminal通信,需要打开例如/dev/tty这样的设备

键盘随时按下中断键(通常是ctrl+c),会给所有前台组里的进程发送SIGINT的信号
键盘随时按下退出键(通常是ctrl+bs),会给所有前台组里的进程发送quit signal的信号
如果终端接口检测到了网络断开,则会给session leader(同时也是controlling process)发送一个hang-up的信号

这也就是为什么是session leader子进程的前台组里的程序在我们断开ssh连接后会立即终止的原因


--
Silence is golden.

twitter: @AccelReality
wikipedia: AleiPhoenix
blog: weblog.areverie.org
wiki: wiki.areverie.org

Casa Zhang

unread,
Aug 21, 2013, 2:38:38 AM8/21/13
to sh...@googlegroups.com
你好,非常感谢你的耐心回复!
     可能我没有理解终端的概念,我现在把我知道的分为两种:
     1,如果我登录图形界面之后,按ctrl+alt+f[2-6]会出现命令行界面,这是一种终端。在这种终端里登录之后无法像图形界面中随便开启另一个终端,这里是你说的tty吗?
     2,进入图形界面,可以开启任一个“终端”(不知道这里是不是叫终端),这里是你说的终端模拟器吗?
上面这两种我不理解有什么区别,是不是上面这两种没开启一个“终端”都会新建一个会话?
望指教!


AleiPhoenix (A.K.A AR)於 2013年8月21日星期三UTC+8上午9時44分01秒寫道:

Zang MingJie

unread,
Aug 28, 2013, 3:46:56 AM8/28/13
to sh...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages