
решение1
Причина, как и во многом другом в мире вычислительной техники, кроется в истории и обратной совместимости.
В ядрах 2.4.*, до того как в Linux появилось udev
(текущее решение виртуальной файловой системы для /dev
), существовало два конкурирующих решения: «традиционный способ Unix», когда устройства располагались в реальном каталоге корневой файловой системы, и devfs
, первое решение виртуальной файловой системы для /dev
.
Проблема была в том, что автор devfs
построил совершенно новую схему именования для различных устройств, и люди были настроены довольно решительно по этому поводу: некоторые хотели перейти на новую схему и отменить старую, другие не видели необходимости в миграции. Некоторые дистрибутивы использовали старые статические устройства, другие выбрали devfs
.
На тот момент существовало фиксированное количество псевдо-TTY-устройств, созданных во время установки. (Кстати, это все еще возможно, если соответствующая опция CONFIG_LEGACY_PTYS
установлена при компиляции ядра.)
Затем были введены динамически выделяемые устройства PTY в стиле Unix98. Для их реализации в статическом /dev
каталоге требовалась виртуальная файловая система для /dev/pts
, и это стало известно как devpts
файловая система. Кроме того, наличие этой файловой системы в качестве отдельной, вероятно, позволило бы применять ее поверх динамической devfs
без дублирования кода.
Динамически выделяемые устройства PTY быстро стали предпочтительным выбором, поскольку загромождение /dev
сотнями статически выделяемых устройств PTY, большинство из которых, возможно, никогда не будут использованы за весь срок службы системы, было явно бессмысленным.
Затем появился Linux 2.6, а udev
с ним и он. Он быстро сделал устаревшими как статические, так /dev
и devfs
решения. По причинам обратной совместимости devpts
файловая система все еще существовала, но теперь ту же функциональность можно было перенести обратно в основную /dev
файловую систему, поскольку она теперь была полностью основана на оперативной памяти.
Сегодня, например, Debian 9 по-прежнему монтирует devpts
файловую систему /dev/pts
для совместимости с устаревшими версиями, но /dev/pts/ptmx
по умолчанию назначает нулевые разрешения — это признак того, что devpts
файловая система, вероятно, устарела и будет удалена в будущем.
# ls -l /dev/ptmx /dev/pts/ptmx
crw-rw-rw- 1 root tty 5, 2 Nov 22 11:47 /dev/ptmx
c--------- 1 root root 5, 2 Nov 12 14:59 /dev/pts/ptmx
Если какой-то программе по-прежнему требуется /dev/pts/ptmx
, это можно разрешить, изменив разрешения по умолчанию, но это позволит людям узнать, какие программы по-прежнему используют старое устаревшее имя устройства.
решение2
Когда процесс открывает /dev/ptmx (используяposix_openpt()), он получает файловый дескриптор для главного псевдотерминала (PTM), а в каталоге /dev/pts создается подчиненное псевдотерминальное устройство (PTS).
Когда открывается мастер, подчиненный блокируется. Вы можете получить имя подчиненного устройства и установить его разрешения и т. д., а затем разблокировать подчиненное устройство. Это позволяет контролировать подчиненное устройство до того, как оно станет доступным.
Подчиненное устройство эмулирует реальное текстовое терминальное устройство, ведущее устройство предоставляет средства, с помощью которых процесс эмулятора терминала управляет подчиненным устройством.
Подчиненное устройство представляет собой виртуальную реализацию физического терминала, а ведущее устройство — виртуальную реализацию ввода текста человеком на этом терминале; компьютер обрабатывает символы, отправленные на подчиненное устройство, так же, как если бы человек набрал их на реальном терминале (ограничено настройками разрешений при создании ведущего устройства).