Tty

我目前的控制終端和/dev/tty之間有什麼關係?

  • February 14, 2020

在 Lubuntu 18.04 上,我在 lxterminal 中執行一個 shell。它的控制終端是目前的偽終端從機:

$ tty
/dev/pts/2

我想知道我目前的控制終端/dev/pts/2/dev/tty.

  1. /dev/tty就像我目前的控制終端一樣/dev/pts/2
$ echo hello > /dev/tty
hello

$ cat < /dev/tty
world
world
^C
  1. 但它們似乎是不相關的文件,而不是一個符號連結或硬連結到另一個:
$ ls -lai /dev/tty /dev/pts/2
5 crw--w---- 1 t    tty 136, 2 May 31 16:38 /dev/pts/2
13 crw-rw-rw- 1 root tty   5, 0 May 31 16:36 /dev/tty

對於具有不同控制終端的不同會話, /dev/tty保證if是它們的控制終端。它怎麼可能是不同的控制終端,而不是符號連結或硬連結?

那麼它們的關係和區別是什麼?任何幫助深表感謝!

這篇文章出自較早的一篇tty 命令的輸出和/dev/tty 文件是否都指向目前bash 程序的控制終端?

第 4 節中的tty聯機幫助頁聲明如下:

文件*/dev/tty*是一個主編號為 5 次編號為 0 的字元文件,通常是模式 0666 和 owner.group root.tty。它是程序控制終端(如果有)的同義詞。

除了ioctl(2)tty 所指的設備支持的ioctl(2)請求外,TIOCNOTTY還支持請求。

TIOCNOTTY

將呼叫程序與其控制終端分離。

如果程序是會話領導者,則SIGHUPSIGCONT信號被發送到前台程序組,並且目前會話中的所有程序都失去了它們的控制 tty。

此呼叫僅適用於連接到*/dev/tty*ioctl(2)的文件描述符 。當使用者在終端呼叫它時,守護程序會使用它。該程序嘗試打開*/dev/tty*。如果打開成功,它使用 將自己與終端分離 ,而如果打開失敗,它顯然沒有附加到終端,不需要自行分離。TIOCNOTTY

這可以部分解釋為什麼/dev/tty不是控制終端的符號連結:它將支持附加的ioctl,並且可能沒有控制終端(但程序總是可以嘗試訪問/dev/tty)。但是文件是不正確的:附加資訊ioctl不僅可以通過 /dev/tty(請參閱mosvy 的答案,這也對 的性質給出了更明智的解釋/dev/tty)。

/dev/tty可以表示不同的控制終端,而不是連結,因為實現它的驅動程序決定呼叫程序的控制終端是什麼,如果有的話。

您可以將其視為/dev/tty控制終端,從而提供僅對控制終端有意義的功能,而/dev/pts/2等是普通終端,其中一個可能恰好是給定程序的控制終端。

引用自:https://unix.stackexchange.com/questions/447197