我正在解决以下问题Unix 教科书 (第 8 章,#16,第 207 页):
提供执行与和命令
chmod
相同任务的命令行。 (提示:每个硬件设备,包括您的终端,在目录中都有一个关联的文件。)mesg n
mesg y
/dev
我相信答案是:
mesg n
=chmod 770 /dev/stdout
mesg y
=chmod 777 /dev/stdout
但我想知道如果你使用会发生什么chmod 000 /dev/stdin
?
您是否被锁定而无法在终端中输入命令?
答案1
不,/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)"
。