Создать общую пару символьных устройств
Я хотел бы создать символьное устройство, которое имеет те же свойства, что и стандартный псевдотерминал, но может быть названо по имени.
По сути, я хотел бы иметь /dev/pts/my-unique-name вместо чисел, которые можно использовать повторно. Есть способ сделать это? Можно mknod
например создать произвольно подключенные char-устройства?
2 ответа
mknod будет работать, за некоторыми исключениями. Синтаксис:
mknod /path/to/new/dev c major minor
Так, например, вы, вероятно, сможете создать новое устройство типа pts с
mknod /tmp/mypts c 136 0
Однако я обнаружил, что если вы попытаетесь сделать это в / dev / pts, вы получите сообщение об отказе в доступе. Я могу сделать это в / dev, но не в / dev / pts. Я на коробке Centos 5.5. YMMV.
Это потому, что / dev / pts монтируется ядром (из моего файла / etc / fstab):
devpts /dev/pts devpts gid=5,mode=620 0 0
Это псевдофайловая система, управляемая ядром, и я бы не подумал, что ее использование - хорошая идея. Стандартный способ получения нового файла - open()ing /dev/ptmx; который получит вызывающий процесс fd назначенного главного терминала, и новое устройство будет создано как /dev/pts/X, где X динамически выделяется ptmx в качестве ведомого. Затем он будет открыт сам по себе, обычно с помощью раздвоенного процесса из исходного.
Вероятно, есть веская причина, почему это сделано именно так. Я не уверен, что это такое, но я бы избегал попыток сломать его, если стабильность системы - это то, что вы цените.
Тем не менее, первая командная строка с реальными опциями, которые я представил, позволит вам создать собственное pts-устройство в любом месте, кроме / dev / pts, и в зависимости от того, что вы собираетесь с ним делать, возможно, этого будет достаточно, чтобы вы Вы идете.
То, о чем вы просите, - это, по сути, вариант использования псевдотерминалов BSD. Драйвер псевдотерминального устройства BSD имел 256 пар номеров инодов (каждая пара состояла из ведущего и подчиненного), и соответствующие иноды были созданы в /dev при установке и оставлены таким образом.
Ничто в ядре не приводило в исполнение какое-либо конкретное именование, но приложение, которому нужно искать неиспользованную пару, обычно имеет определенные ожидания относительно именования.
Большинство людей считают псевдотерминалы BSD устаревшими с введением псевдотерминалов Unix 98. И, похоже, во многих дистрибутивах Linux отсутствует поддержка псевдотерминалов BSD. Однако, если вы можете найти ядро, в котором все еще есть поддержка псевдотерминалов BSD, то вы можете использовать эту поддержку для создания пары inode устройств, точно так, как вы просите.
mknod /dev/my-master c 2 42
mknod /dev/my-slave c 3 42
Обратите внимание, что те должны оставаться за пределами /dev/pts
, как /dev/pts
для псевдотерминалов Unix 98
Если вам просто нужно передать поток символов и не нужны все другие функции, которые может предложить псевдотерминал, тогда может быть проще использовать именованный канал.