
答案1
Xterm已經/dev/ptmx
打開了,但你這樣看不到。原因如下。
您的xterm
可執行權限已S_ISGID
設定 (set-group-ID) 位,並且是群組擁有的utmp
。
它以這種方式設置,以便xterm
可以將條目添加到/var/run/utmp
和(確切的路徑可能會根據您的系統而有所不同),以便您的會話顯示在或/var/log/wtmp
的輸出中。who
last
有了這些權限,當xterm
執行時,執行它的進程將看到它的有效的群組 ID 變更為該utmp
群組的 ID(同時讀群組 ID 將保持不變),這將授予其以寫入模式開啟utmp
/登入記錄的權限。wtmp
在 Linux 上,作為安全措施,只能root
列出有效使用者 ID 與真實使用者 ID 不同或有效群組 ID 與真實群組 ID 不同的進程的開啟檔案。 (您會注意到,與其他進程相比,此類進程/proc/<pid>fd
具有權限)。dr-x------ root root
dr-x------ you your-group
這就是為什麼lsof
,以普通使用者身分執行時無法列出該xterm
進程的開啟檔案。你需要運行lsof
為root
.
至於為什麼它適用於gnome-terminals
,有幾種可能性:
gnome-terminal
不在登入記錄中新增條目(我的系統就是這種情況)gnome-terminal
使用utempter
幫手(在這種情況下是 sgidutmp
)新增登入記錄。這就是我的系統上xterm
要做的事情konsole
。gnome-terminal
utmp
更新登入記錄後(這xterm
不會執行),將有效使用者 ID 重設為真實使用者 ID(暫時放棄特殊存取權限)。
答案2
這就是偽終端主設備Linux。但xterm使用POSIX函數開啟偽終端,隱藏了開啟裝置的細節。
偽終端有不同的配置,但您的系統可能使用這塊:
#elif defined(HAVE_POSIX_OPENPT) && defined(HAVE_PTSNAME) && defined(HAVE_GRANTPT_PTY_ISATTY)
if ((*pty = posix_openpt(O_RDWR)) >= 0) {
char *name = ptsname(*pty);
if (name != 0) {
strcpy(ttydev, name);
result = 0;
}
}
VTE(實際的終端模擬器:「gnome-terminal」是一個正面)使用類似的東西(參見src/pty.cc)。
實際上沒有必要繼續使用主設備的文件描述符。 xterm 作為兩個進程運行,並且用途該檔案描述符位於其「父」進程中。它丟棄主設備的文件描述符「子」進程(參見來源)。
當您執行 xterm 時,子行程是你的 shell 與之對話的那個,例如,如果你運行tty
查看您正在使用哪個終端(即使用奴隸偽終端的一側,以及掌握side 是封閉的,因為每個行程只需要使用偽終端的一邊)。
這父親行程(已/dev/ptmx
開啟)管理 X 視窗顯示。
考慮到所有這些,我希望看到lsof
show xterm 已經/dev/ptmx
打開。除了:
- 在您的螢幕截圖中,該訊息暗示您沒有運行根,如果存在權限問題導致
lsof
其無法查看所有進程,那麼這可能是丟失資訊的原因。 - 你的 xterm 實際上並沒有在你正在運行的機器上運行
lsof
,例如,如果你已經通過 ssh 進入了機器(並且你碰巧看到gnome-terminal
在不同的會話中運行)。