X會話管理器是一個會話管理程式,這個程式能夠保存和恢復一組程式的當前運行狀態。
概述
從X會話管理器的角度來看,一個會話是指給定時間的桌面狀態:一組視窗以及它當前的內容。更精確的說,一個會話是一組管理視窗或與視窗有關的客戶端以及允許這些程式恢復所需視窗的相關信息。使用會話管理器最顯著的效果是再次登錄進入時所有視窗和狀態與登出時完全一致。為達到這一點,會話管理器程式存儲在登出時運行的程式名稱並在再次登錄時啟動它們。此外,為了能較好的恢復程式的狀態(恢復視窗內容是必需的),當會話管理器要求時程式必須能保存它們的運行狀態並在重啟時重新裝載它們。
通常,會話能在任意時刻保存或裝載,即使用戶沒有登錄或登出。保存一系列不同的會話並按用戶的選擇裝載其中一個,這是可能的。也可以將一系列程式組合成一個會話。結果是,用戶能夠保存一些不同的會話,也能存儲當前運行程式的狀態或明確的將一些程式組合為一個會話。這樣,用戶可稍後決定裝載某個會話。
為了能讓會話包括程式的狀態,程式必須能在適當的時候保存和裝載它當前的狀態。X會話管理協定(XSMP)指定程式與會話管理器該如何互動。特別重要的是視窗管理器能夠與會話管理器通信,因為視窗管理器對視窗的位置和最小化有管理的責任。不能保存狀態的程式也包括在會話中,但它們不能在會話中維持自己的狀態。
XWindow系統包含了默認的會話管理器,名字叫xsm。特定的桌面系統也開發了自己的會話管理器:例如,ksmserver是KDE默認的會話管理器。
協定
XSMP是客戶間交換協定(Inter-ClientExchangeProtocol)的子協定。客戶端連線到會話管理器時開始協定。如何在網路中定位會話管理器是依賴系統的:對POSIX系統來說,環境變數包含了一個SESSION_MANAGER變數。因此,當客戶端開始時,SESSION_MANAGER變數必須是適當的值。標識符
該協定要考慮兩方面:為了能讓會話正確的重啟,不但程式必須重啟,而且它們必須以這樣一種方式恢復原先的狀態;
同樣的程式可能在同一個會話或不同會話中多次運行。
該會話有兩個xedit程式的實例,並分別打開不同的檔案
同一個程式的不同實例可能會在同一個或不同會話中同時運行,這些會話大多具有不同的運行狀態。例如,用戶可用文本編輯器打開/etc/passwd檔案,同時在同一個會話中打開letter.txt檔案,在另一個會話中打開todo.txt檔案。
為了能完全的恢復會話,會話管理器必須認定同一個程式的不同實例是不同的。基於這一原因,會話管理器為每一個程式的每一個實例選擇一個唯一的標識符。這樣,會話管理器就能區分打開/etc/passwd檔案和打開todo.txt檔案的文本編輯器,即使他們是相同程式的兩個實例。
標識符必須唯一。特別是,在由會話管理器管理的所有會話中他們也必須是唯一的:打開/etc/passwd檔案的文本編輯器的標識符不僅不同於打開letter.txt檔案的文本編輯器的標識符,而且不同於在另一個會話中打開todo.txt檔案的文本編輯器的標識符。即使會話關閉和重啟,客戶端的標識符保持相同。
協定主體
會話管理協定的主要部分是:會話管理器為每個客戶端選擇一個唯一的標識符
會話管理器需要客戶端保存他們的狀態
客戶端指定它該如何重啟以便恢復狀態(例如,使用命令行來啟動程式)
最後一點是可行的,因為會話管理器維護每個客戶端的一組屬性(在XWindow系統中,屬性是數據的簡單容器)。客戶端可在任何時刻修改信息。其中一個屬性是RestartCommand,它指示客戶端如何重啟。
當會話管理器需要客戶端保存其狀態時,程式按以下步驟運行:
以一種方式保存其狀態,兩個不同實例的狀態必須區分;保存狀態的檔案的名字以它的標識符構成,這樣就可區分不同實例
在RestartCommand屬性中保存重啟該程式的方法;該屬性必須包含客戶端標識符,因為:
程式必須在重啟時保持其標識符
保存狀態時需要用到標識符(例如,使用標識符尋找狀態保存在哪個檔案)
除了RestartCommand,會話管理器還維護其他屬性。例如,有一個屬性指示,當會話銷毀時,如何運行程式。
本地和全局狀態
當請求客戶端保存狀態時,視窗管理器會指定保存本地狀態還是全局狀態,或者都保存。兩者的區別是保存的狀態對其他程式是否可見。以文本編輯器為例,保存全局狀態意味著正常保存檔案,其他程式都能看到被文本編輯器修改後的新檔案。保存本地狀態意味著保存一個檔案的本地複本,其他程式都看不到檔案新修改的部分。
一個例子
以下是超文本編輯器xyx和會話管理器互動時的主要步驟,情景是當超文本編輯器在會話中第一次啟動,然後用戶登出,最後用戶再次登錄:超文本編輯器通用客戶間交換協定(Inter-ClientExchangeProtocol)連線到會話管理器
超文本編輯器告訴會話管理器這是它第一次啟動,因此它沒有標識符(也因此,沒有先前的狀態)
會話管理器分配給它一個唯一的標識符,比如4324
會話管理器立即要求超文本編輯器保存它的本地狀態(只保存本地狀態,因為它第一次啟動)
超文本編輯器在會話管理器的RestartCommand屬性中保存一段命令行代碼xyz-sid4324(這是依賴特定系統的:在POSIX系統中,這個屬性會用於argv環境參數數組中)
超文本編輯器保存它的本地狀態;例如,可能保存編輯文本的名字和其他所有信息(比如當前行)到本地.temp-4324檔案中
當用戶登出時,會話管理器傳送信息給所有客戶端通知它們保存各自的狀態
超文本編輯器(標識符為4324)再次答應
當所有客戶端通知會話管理器狀態已保存,會話管理器就會關閉會話
當客戶端被告知要保存狀態時,它有可能還能與用戶進行有限的互動(例如,詢問用戶是否保存正在編輯的檔案)。不管怎樣,狀態保存後,它會向會話管理器傳送適當的訊息。
當會話再次啟動時,發生以下步驟:
會話管理器執行保存在RestartCommand屬性中的代碼以此重啟標識符為4324的客戶端
因此以運行命令行xyz-sid4324的方式啟動超文本編輯器;這樣,超文本編輯器就知道自己的標識符
超文本編輯器從.temp-4324檔案中找回狀態信息
超文本編輯器連線會話管理器,指明自己的標識符為4324,以便會話管理器得知其不是新啟動的程式