X会话管理器

在X Window系统中，X会话管理器是一个会话管理程序，这个程序能够保存和恢复一组程序的当前运行状态。

概述 

从X会话管理器的角度来看，一个会话是指给定时间的桌面状态：一组窗口以及它当前的内容。更精确的说，一个会话是一组管理窗口或与窗口有关的客户端以及允许这些程序恢复所需窗口的相关信息。

使用会话管理器最显著的效果是再次登录进入时所有窗口和状态与登出时完全一致。为达到这一点，会话管理器程序存储在登出时运行的程序名称并在再次登录时启动它们。此外，为了能较好的恢复程序的状态(恢复窗口内容是必需的)，当会话管理器要求时程序必须能保存它们的运行状态并在重启时重新装载它们。

通常，会话能在任意时刻保存或装载，即使用户没有登录或登出。保存一系列不同的会话并按用户的选择装载其中一个，这是可能的。也可以将一系列程序组合成一个会话。结果是，用户能够保存一些不同的会话，也能存储当前运行程序的状态或明确的将一些程序组合为一个会话。这样，用户可稍后决定装载某个会话。

为了能让会话包括程序的状态，程序必须能在适当的时候保存和装载它当前的状态。X 会话管理协议 (XSMP)指定程序与会话管理器该如何交互。特别重要的是窗口管理器能够与会话管理器通信，因为窗口管理器对窗口的位置和最小化有管理的责任。不能保存状态的程序也包括在会话中，但它们不能在会话中维持自己的状态。

X Window系统包含了默认的会话管理器，名字叫xsm。特定的桌面系统也开发了自己的会话管理器：例如，ksmserver是KDE默认的会话管理器。

协议 

XSMP是客户间交换协议的子协议。客户端连接到会话管理器时开始协议。如何在网络中定位会话管理器是依赖系统的：对POSIX系统来说，环境变量包含了一个SESSION_MANAGER变量。因此，当客户端开始时，SESSION_MANAGER变量必须是适当的值。

标识符 

该协议要考虑两方面：

为了能让会话正确的重启，不但程序必须重启，而且它们必须以这样一种方式恢复原先的状态；
同样的程序可能在同一个会话或不同会话中多次运行。

同一个程序的不同实例可能会在同一个或不同会话中同时运行，这些会话大多具有不同的运行状态。例如，用户可用文本编辑器打开/etc/passwd文件，同时在同一个会话中打开letter.txt文件，在另一个会话中打开todo.txt文件。

为了能完全的恢复会话，会话管理器必须认定同一个程序的不同实例是不同的。基于这一原因，会话管理器为每一个程序的每一个实例选择一个唯一的标识符。这样，会话管理器就能区分打开/etc/passwd文件和打开todo.txt文件的文本编辑器，即使他们是相同程序的两个实例。

标识符必须唯一。特别是，在由会话管理器管理的所有会话中他们也必须是唯一的：打开/etc/passwd文件的文本编辑器的标识符不仅不同于打开letter.txt文件的文本编辑器的标识符，而且不同于在另一个会话中打开todo.txt文件的文本编辑器的标识符。即使会话关闭和重启，客户端的标识符保持相同。

协议主体 

会话管理协议的主要部分是：

会话管理器为每个客户端选择一个唯一的标识符
会话管理器需要客户端保存他们的状态
客户端指定它该如何重启以便恢复状态（例如，使用命令行来启动程序）

最后一点是可行的，因为会话管理器维护每个客户端的一组属性（在X Window系统中，属性是数据的简单容器）。客户端可在任何时刻修改信息。其中一个属性是RestartCommand，它指示客户端如何重启。

当会话管理器需要客户端保存其状态时，程序按以下步骤运行：

以一种方式保存其状态，两个不同实例的状态必须区分；保存状态的文件的名字以它的标识符构成，这样就可区分不同实例
在RestartCommand属性中保存重启该程序的方法；该属性必须包含客户端标识符，因为：
程序必须在重启时保持其标识符
保存状态时需要用到标识符（例如，使用标识符寻找状态保存在哪个文件）

除了RestartCommand，会话管理器还维护其他属性。例如，有一个属性指示，当会话销毁时，如何运行程序。

本地和全局状态 

当请求客户端保存状态时，窗口管理器会指定保存本地状态还是全局状态，或者都保存。两者的区别是保存的状态对其他程序是否可见。

以文本编辑器为例，保存全局状态意味着正常保存文件，其他程序都能看到被文本编辑器修改后的新文件。保存本地状态意味着保存一个文件的本地复本，其他程序都看不到文件新修改的部分。

一个例子 

以下是超文本编辑器xyx和会话管理器交互时的主要步骤，情景是当超文本编辑器在会话中第一次启动，然后用户登出，最后用户再次登录：

超文本编辑器通用客户间交换协议连接到会话管理器
超文本编辑器告诉会话管理器这是它第一次启动，因此它没有标识符（也因此，没有先前的状态）
会话管理器分配给它一个唯一的标识符，比如4324
会话管理器立即要求超文本编辑器保存它的本地状态（只保存本地状态，因为它第一次启动）
超文本编辑器在会话管理器的RestartCommand属性中保存一段命令行代码xyz -sid 4324（这是依赖特定系统的：在POSIX系统中，这个属性会用于argv环境参数数组中）
超文本编辑器保存它的本地状态；例如，可能保存编辑文本的名字和其他所有信息（比如当前行）到本地.temp-4324文件中
当用户登出时，会话管理器发送信息给所有客户端通知它们保存各自的状态
超文本编辑器（标识符为4324）再次答应
当所有客户端通知会话管理器状态已保存，会话管理器就会关闭会话

当客户端被告知要保存状态时，它有可能还能与用户进行有限的交互（例如，询问用户是否保存正在编辑的文件）。不管怎样，状态保存后，它会向会话管理器发送适当的消息。

当会话再次启动时，发生以下步骤：

会话管理器执行保存在RestartCommand属性中的代码以此重启标识符为4324的客户端
因此以运行命令行xyz -sid 4324的方式启动超文本编辑器；这样，超文本编辑器就知道自己的标识符
超文本编辑器从.temp-4324文件中找回状态信息
超文本编辑器连接会话管理器，指明自己的标识符为4324，以便会话管理器得知其不是新启动的程序

客户端管理会话 

依照XSMP协议，只要能够运行和控制其他程序状态的程序都可以是会话管理器。所以，一个客户端本身可以成为其他客户端的会话管理器。例如，Email客户端能启动一个文本编辑器来编写邮件，并在编辑器前表现的像会话管理器。因此，如果电邮客户端并闭后再启动时，它能恢复文本编辑器的状态。

历史 

GNOME的会话管理器用D-Bus(版本2.24.)取代了XSMP

参见 

 X Window系统的协议和架构
 X窗口管理器

参考文献

外部链接 

 X会话管理协议
 xsm手册 
 ksmserver ，KDE会话管理器
 ROX-Session ，ROX Desktop会话管理器

X Window系统