chmod 000 /dev/stdin 会永远禁用终端吗?

Phi*_*ide 12 terminal chmod devices

我正在解决来自Unix The Textbook (第 8 章,#16,第 207 页)的问题

给出chmodmesg nmesg y命令执行相同任务的命令行。(提示:每个硬件设备,包括您的终端,在/dev目录中都有一个关联的文件。)

我相信答案是:

mesg n = chmod 770 /dev/stdout

mesg y = chmod 777 /dev/stdout

但我想知道如果你使用会发生什么chmod 000 /dev/stdin

您是否无法在终端中输入命令?

Gil*_*il' 20

没有,/dev/stdin并且/dev/stdout都是错误的设备。这些不是终端设备,它们分别是标准输入和标准输出的别名。标准输入和标准输出,根据定义,文件描述符应用程序期望能够打开和具有常规的含义(文件描述符0和1分别有2也是这是标准误差)。当应用程序需要文件名,但应用程序的用户希望它访问特定的文件描述符而不是打开某个文件时,诸如/dev/stdin和 之/dev/stdout类的设备很有用。根据 unix 变体,它们甚至可能不是设备文件;例如,在 Linux 上,它们是指向/proc/self/fd/0 和朋友,而这些又是指向进程已经在该文件描述符上打开的任何文件的“神奇”符号链接。

更改的权限,/dev/stdin并且/dev/stdout将只更改时,这些文件的名称都明确地使用会发生什么。它不会影响与终端相关的任何内容,也不会影响标准输入和标准输出的正常使用,因为权限仅在打开特定文件名时才重要。

什么mesg确实是改变过程的的权限控制终端。对于在终端中运行的应用程序,终端在标准输入、标准输出和标准错误(文件描述符 0、1 和 2)上打开。您可以使用该命令tty查看终端设备是什么。mesg n等价于chmod g-w "$(tty)"并且mesg y等价于chmod g+w "$(tty)"

  • `tty` 不报告控制终端,但终端在 stdin 上打开(如果有)。因此,在 Linux 上,/dev/stdin 不是设备,而是指向在 /dev/stdin 上打开的文件的特殊符号链接,`chmot "$(tty)"` 或多或少与 `chmod /dev/stdin` 相同(如果 stdin 是 tty 设备,并且会尝试更改当前目录中的“not a tty”文件的模式,否则)。有关控制终端,请参阅`/dev/$(ps -o tty= -p "$$")`。 (2认同)