為什麼 xterm 沒有開啟 /dev/ptmx 檔案?

為什麼 xterm 沒有開啟 /dev/ptmx 檔案?

gnome-terminal開啟/dev/ptmx文件:

在此輸入影像描述

xterm沒有打開:

在此輸入影像描述

我認為每個終端模擬器都必須/dev/ptmx打開該文件,那麼為什麼 xterm 不打開它?


編輯:這是ls -ld "$(command -v xterm)"(響應於 史蒂芬·查澤拉斯):

在此輸入影像描述

答案1

Xterm已經/dev/ptmx打開了,但你這樣看不到。原因如下。

您的xterm可執行權限已S_ISGID設定 (set-group-ID) 位,並且是群組擁有的utmp

它以這種方式設置,以便xterm可以將條目添加到/var/run/utmp和(確切的路徑可能會根據您的系統而有所不同),以便您的會話顯示在或/var/log/wtmp的輸出中。wholast

有了這些權限,當xterm執行時,執行它的進程將看到它的有效的群組 ID 變更為該utmp群組的 ID(同時群組 ID 將保持不變),這將授予其以寫入模式開啟utmp/登入記錄的權限。wtmp

在 Linux 上,作為安全措施,只能root列出有效使用者 ID 與真實使用者 ID 不同或有效群組 ID 與真實群組 ID 不同的進程的開啟檔案。 (您會注意到,與其他進程相比,此類進程/proc/<pid>fd具有權限)。dr-x------ root rootdr-x------ you your-group

這就是為什麼lsof,以普通使用者身分執行時無法列出該xterm進程的開啟檔案。你需要運行lsofroot.

至於為什麼它適用於gnome-terminals,有幾種可能性:

  • gnome-terminal不在登入記錄中新增條目(我的系統就是這種情況)
  • gnome-terminal使用utempter 幫手(在這種情況下是 sgid utmp)新增登入記錄。這就是我的系統上xterm要做的事情konsole
  • gnome-terminalutmp更新登入記錄後(這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 視窗顯示。

考慮到所有這些,我希望看到lsofshow xterm 已經/dev/ptmx打開。除了:

  • 在您的螢幕截圖中,該訊息暗示您沒有運行,如果存在權限問題導致lsof其無法查看所有進程,那麼這可能是丟失資訊的原因。
  • 你的 xterm 實際上並沒有在你正在運行的機器上運行lsof,例如,如果你已經通過 ssh 進入了機器(並且你碰巧看到gnome-terminal在不同的會話中運行)。

相關內容