2012-10-19 41 views
0

我正在開發一個小型服務器程序,它接收從網絡收到的數據並執行各種操作。其中一項操作是打開與系統上運行的X服務器的連接並模擬按鍵。當我的服務器從X內部的終端啓動時,這很好,但我希望我的程序作爲系統服務啓動,系統引導,然後在客戶端請求時與X進行通信。Linux&C:從X之外與X服務器通信?

我遇到的基本問題是在沒有從X內部啓動的進程中調用XOpenDisplay(NULL)失敗。據我所知,我無法從X之外打開X顯示器,所以我能想到的最佳解決方法是編寫一個單獨的程序,該程序在用戶登錄到X時等待信號或消息時啓動從服務器,然後執行請求的操作。如果這個幫助程序由於某種原因沒有運行或失敗,假設服務器可以向客戶端發送一個錯誤是完全可以的。

所以問題:我上面描述的是最好的(儘管是混亂的)解決方案,還是有更好的方法?事實上,有沒有辦法從X之外打開X顯示器?謝謝!

+0

試試'DISPLAY =:0。/ program'。 – jweyrich

+0

@jweyrich Gah,當我玩DISPLAY envvar時,我正在分配它,然後運行我的程序,但忘記了'export'並假設其他東西是錯的。這確實有效,但它仍然意味着我假定顯示實際上是「:0:'。 – shanet

回答

1

可以從機器上運行的任何進程連接到X顯示器 - 您需要DISPLAY變量集來指示要連接到哪個X會話,並且可能需要正確的XAuthority標記。

但是,這將被視爲您的案例的「混亂」的解決方案,因爲您需要從本質上猜測顯示編號並解決授權問題。當守護進程啓動時,或者當守護進程正在運行時X服務器重新啓動時,您還必須處理X服務器尚未啓動的情況(X客戶端庫並非真正用於處理X服務器離開並再次回來)。

「乾淨的」解決方案實際上是您建議的一種解決方法 - 在X會話中運行的客戶端,通過UNIX域套接字或類似方式連接到守護進程。

+0

這是關於不知道使用「DISPLAY」的好處。我想我可以爲我的程序創建一個配置文件,如果沒有另外指定,默認顯示爲「:0」。如果我將我的程序設置爲服務(在'/ etc/init.d'中)是否公平它將以足夠的權限與任何X會話進行通信? – shanet

+1

@shanet:否 - 這取決於配置X的方式,但通常您需要一個「magic cookie」值或存儲在登錄用戶主目錄中的.Xauthority文件中的密鑰。 – caf

3

「在X之內」只是設置了DISPLAY環境變量。你可以從任何地方做到這一點。

如果有問題的X服務器正在爲其他用戶運行,則可能還需要處理認證令牌,如Xauthority票證。

但是,對於您描述的用例,我強烈建議運行您自己的X服務器進程,而不管系統的實際顯示硬件。如果您想連接到交互式檢查或簡單的無頭執行,那麼這可能是Xvnc,如果您根本不需要顯示緩衝區,則可能是Xvfb。這種方法也會阻止你的軟件在用戶登錄和註銷時需要重新啓動,否則情況就是如此。

+0

你說得對'DISPLAY' envvar,但我不想將顯示硬編碼爲':0:'。我看着'Xvfb',但也許我應該多解釋一下。我的目標是模擬媒體按鍵,以播放/暫停正在用戶啓動的X進程中運行的媒體播放器(以免僅與特定的媒體播放器一起工作)。據我所知,創建一個新的X進程將發送這些模擬鍵按沒有。 – shanet

+1

@shanet如果你創建自己的X服務器,比如'Xvnc',你可以告訴它哪個'DISPLAY'使用。 –

+1

@shanet順便說一句,哪個媒體播放器是這個?更好的控制套接字機制對接收按鍵沒有任何依賴性或要求;使用更適合目的的東西可能更合適。 –