【问题标题】:What is special about /dev/tty? [closed]/dev/tty 有什么特别之处? [关闭]
【发布时间】:2011-12-15 03:24:15
【问题描述】:

ls -la /dev/tty 显示输出:

crw-rw-rw- 1 root tty 5, 0 Dec 14 22:21 /dev/tty

开头的c是什么意思?当我执行pwd > /dev/tty 之类的操作时,它会打印到标准输出。文件 /dev/tty 包含什么?

【问题讨论】:

    标签: unix


    【解决方案1】:

    'c' 表示它是一个字符设备。 tty 是一个特殊文件,代表当前进程的“控制终端”。

    字符设备

    Unix 支持“设备文件”,它根本不是真正的文件,而是硬件设备的类似文件的访问点。 “字符”设备是逐字节接口的设备(与缓冲 IO 不同)。

    TTY

    /dev/tty 是一个特殊文件,代表当前进程的终端。因此,当您echo 1 > /dev/tty 时,您的消息 ('1') 将出现在您的屏幕上。同样,当您cat /dev/tty 时,您的后续输入会重复(直到您按下 Ctrl-C)。

    /dev/tty 本身并不“包含”任何东西,但是您可以从中读取并写入它(对于它的价值)。我想不出它有什么用处,但是有一些类似的文件对简单的 IO 操作非常有用(例如,/dev/ttyS0 通常是你的串口)

    此引用来自http://tldp.org/HOWTO/Text-Terminal-HOWTO-7.html#ss7.3

    /dev/tty 代表当前的控制终端(如果有) 过程。找出哪些 tty 连接到哪些进程使用 shell 提示符下的“ps -a”命令(命令行)。看着那(这 “tty”列。对于您所在的 shell 进程,/dev/tty 是 您现在使用的终端。在 shell 提示符下输入“tty”来查看 它是(参见手册 pg.tty(1))。 /dev/tty 类似于指向的链接 具有一些附加功能的实际终端设备名称 C 程序员:参见手册页 tty(4)。

    这里是手册页:http://linux.die.net/man/4/tty

    【讨论】:

    • /dev/tty 的一个很好的用途是,如果您尝试调用管道中的编辑器(例如,使用 xargs)。由于xargs 的标准输入是一些文件列表而不是您的终端,因此只需执行例如| xargs emacs 就会搞砸您的终端。相反,您可以使用| xargs sh -c 'emacs "$@" </dev/tty' emacs 将编辑器连接到您的终端,即使xargs 的输入来自其他地方。 (我系统上的 xargs 手册页建议了这种用法。)
    【解决方案2】:

    /dev/tty 是当前进程的控制终端(如果有)的同义词。正如jtl999所说,它是一个字符特殊文件;这就是ls -l 输出中的c 的含义。

    man 4 ttyman -s 4 tty 应该会给你更多信息,或者你可以阅读在线手册页here

    顺便说一句,pwd > /dev/tty 不一定 打印到 shell 的标准输出(尽管它是 pwd 命令的标准输出)。如果 shell 的标准输出被重定向到终端以外的地方,/dev/tty 仍然指向终端。

    您也可以从/dev/tty 读取,这通常会从键盘读取。

    【讨论】:

    • 我听不懂你的pwd > /dev/tty doesn't necessarily print to stdout. If standard output has been redirected to something other than the terminal。在我看来,它总是将进程的文件描述符 1 设置为 /dev/tty。你能解释一下吗?
    • @dagang:你的观点是错误的。如果标准输出被重定向到一个文件,文件描述符 1 将指向该文件,not 指向终端。这就是重定向的意思。
    • 是的,fd 1 可以引用任何文件,但>/dev/tty 始终意味着使 fd 1 引用终端,而不管 fd 1 引用的位置。你能举个例子来支持你的论点吗?
    • 它如何产生影响的示例:( echo to stdout ; echo to tty > /dev/tty ) > a_file 会发现“to stdout”被重定向到 a_file,但“to tty”仍会出现在运行 shell 的终端上,并且不会被重定向到 a_file。运行 ( ... ) 内的部分的子 shell 已将标准输出重定向到一个文件,但控制终端仍然是父 shell 正在运行的任何终端,例如您的 xterm 或 ssh 或串行控制台等。
    • 我发现做这样的事情非常有用find . -type d -name dummy | tee /dev/tty | xargs rm
    【解决方案3】:

    'c' 表示它是一个字符特殊文件。

    【讨论】:

      猜你喜欢
      • 2011-05-19
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多