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客戶端能啟動一個文本編輯器來編寫郵件,並在編輯器前表現的像會話管理器。因此,如果電郵客戶端並閉後再啟動時,它能恢復文本編輯器的狀態。
歷史
[編輯]此章節需要擴充。 (2009年1月1日) |
GNOME的會話管理器用D-Bus(版本2.24.[1])取代了XSMP