我可以通过测试提供的方法来看到 /dev/tty 和 /dev/tty0 之间的区别问题。但我真的很想知道这些设备的实际用途(比如它们将被使用的情况)。
答案1
/dev/tty
是当前的控制tty过程,对于实际打开此特殊文件的任何进程。它不一定是虚拟控制台设备(/dev/tty
n),并且可以是普蒂、串行端口等。如果控制 tty 不是虚拟控制台,则该进程不必与控制台设备交互,即使其伪终端实际上是在系统控制台上实现的。例如对于本地运行的 X 服务器下的终端仿真器中的 shell,所述程序形成如下交互链:
Unix shell
⇕ /dev/pts/2
(/dev/tty
对于其进程来说是 ==)
内核 pty 驱动程序
⇕/dev/ptmx
终端仿真器
⇕ X Window 协议
X 服务器
⇕ /dev/tty7
(/dev/tty
对于服务器来说是 ==)
系统控制台
zxc↿⇂[_̈░░]
用户
用户态程序的使用/dev/tty
包括:
- 向控制终端写入一些内容,忽略所有重定向和管道;
- 创建一个 ioctl() – 参见 tty_ioctl(4);
- 例如,从终端分离 (TIOCNOTTY)。
/dev/tty0
是当前活动的(即在监视器上可见)虚拟控制台的操作系统。这个特殊文件不太可能被系统软件大量使用,但是/dev/console
实际上是一个“别名”tty0
并且/dev/console
被 syslog 守护进程大量使用,有时也被内核本身使用。
进行实验以显示差异:root
在tty3
( Ctrl+ Alt+ F3) 或终端模拟器中运行 shell。现在
# sleep 2; echo test >/dev/tty
然后快速Ctrl+ Alt+ F2,等待两秒钟,然后Ctrl+ Alt+ 回来。你在哪里看到输出?
现在对 进行相同的测试/dev/tty0
。
答案2
/dev/tty 是任何进程的控制 tty。这可能是你的外壳。
如果您的进程没有控制 tty,则 /dev/tty 不可用,这对于守护程序来说是正确的。
如果您的进程有一个控制 tty,那么 /dev/tty 是您的进程用于 stdin、stdout 或 stderr 的真实 tty 驱动程序的驱动程序别名。
请参阅man -s7d tty
获取更多信息。请注意,本手册所在的部分可能因不同操作系统而异,不应与第 1 部分中的手册页混淆。因此请检查例如man -k tty
。