Я работаю над вопросами из Unix The Textbook (глава 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
?
Вы заблокированы от ввода команд в терминале?
mesg n
можешь использовать разрешение повлиять на будущееwrite
s только потому , чтоwrite
не уже есть терминал открыты.Ответы:
Нет,
/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
не сообщает управляющий терминал, но терминал открыт на стандартном вводе, если таковой имеется. Таким образом, в Linux, где / dev / stdin - это не устройство, а специальная символическая ссылка на файл, открытый в / dev / stdin,chmot "$(tty)"
будет более или менее такой же, какchmod /dev/stdin
(если stdin является устройством tty и попытается изменить режимnot a tty
файл в текущем каталоге в противном случае). Смотрите/dev/$(ps -o tty= -p "$$")
для управляющего терминала.