netstat 輸出中的 lxterminal
你能解釋一下
netstat
輸出中的以下幾行嗎?Active UNIX domain sockets (w/o servers) Proto RefCnt Flags Type State I-Node Path unix 2 [ ] STREAM CONNECTED 37133819 /tmp/.lxterminal-socket:0-xralf unix 2 [ ] STREAM CONNECTED 37109191 /tmp/.lxterminal-socket:0-xralf
客戶端-伺服器 GUI 程序
與現在的其他幾個 GUI 程序一樣,自 2008 年以來
lxterminal
一直試圖從單個程序顯示所有終端仿真器視窗,每個使用者每個 X 顯示一個。為此,它會嘗試通過您所看到的名稱類型連接到現有套接字,該名稱包含顯示名稱和您的使用者名。
- 如果連接成功,它只是將其目前目錄和參數向量轉儲到套接字並退出。它不使用文件描述符傳遞將打開的文件描述符直接傳遞到其目前目錄,而是通過名稱傳遞。
- 如果連接失敗,它會嘗試自己成為該套接字上的偵聽伺服器。它讀取包含目前目錄和參數向量的消息,並為每次讀取打開一個新的 GUI 終端仿真視窗,就好像它是它自己的目前目錄和參數向量一樣。
這樣做的明顯效果是
lxterminal
您呼叫(並保持執行)的第一個程序同步執行,而第二個和後續程序則不同步執行。要觀察這一點,請先不執行任何lxterminal
實例,然後執行不同的終端模擬器,然後呼叫lxterminal & 睡眠 1 ; lx終端
從一個殼。shell 將在 1 秒後返回提示符,並顯示僅剩 1 個
lxterminal
作業正在執行。rxvt 具有類似的功能,但必須顯式呼叫
urxvtd
伺服器,並顯式執行urxvtc
客戶端。執行 plainurxvt
不會嘗試任何客戶端-伺服器惡作劇。相比之下, GNOME 終端只能以這種方式工作。它總是將參數向量傳遞給伺服器程序,然後退出。此外,每個使用者只有一個伺服器程序,處理所有顯示(以及該機制初始化的方式中的錯誤,以啟動)。
不安全感
創建具有可預測名稱的文件和套接字
/tmp
是一個眾所周知的安全問題,並且lxterminal
共享它。lxterminal
使用者可以在同一台機器上的其他使用者嘗試與之交談 的可預測位置預先創建套接字。相反,rxvt 使用每個使用者主目錄的非組可寫非其他可寫子目錄。另一種解決此問題的方法
lxterminal
同樣不允許其他使用者使用他們的插座替換自己的插座,這將是讓插座位於./run/user/*username*/lxterminal
(GNOME 終端使用使用者級桌面匯流排在客戶端和它的伺服器之間進行通信。如今,它的
AF_LOCAL
套接字存在於其他非特權使用者無法取代的地方。)/run/user/*username*/
錯誤
困擾 GNOME 終端的問題之一是它在單個伺服器程序中為終端仿真的每個實例佔用了大量打開的文件描述符。以前是 16;現在下降到“僅僅”8。
lxterminal
使用 2,其中之一是來自客戶端程序的套接字連接的洩漏打開文件描述符。打開和關閉足夠多的終端仿真,最終lxterminal
將耗盡可用的文件描述符。以下,從沒有lxterminal
執行實例開始,在我的一台機器上在一分鐘內用完所有伺服器的可用文件描述符:(ulimit -H -n 1024 ; lxterminal) & 序列 0 1024 | 同時讀取 -ri ; 做 lxterminal -e /usr/bin/true ; 完畢
進一步閱讀
- 無法從其 PID 中殺死 gedit 程序
- 執行 gnome-terminal 的真正多程序實例
- 弗雷德·簡 (2008-06-16)。 為程序共享添加失去的文件。1f69f854d8ab1377888e18c759f11eae99da75b9。lxde/lx 終端。GitHub。
- 弗雷德·簡 (2008-06-16)。 添加程序共享支持。074ec09b779c0265a316d37742d2957146bcb141。lxde/lx 終端。GitHub。