Создать общую пару символьных устройств

Я хотел бы создать символьное устройство, которое имеет те же свойства, что и стандартный псевдотерминал, но может быть названо по имени.

По сути, я хотел бы иметь /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

Если вам просто нужно передать поток символов и не нужны все другие функции, которые может предложить псевдотерминал, тогда может быть проще использовать именованный канал.

Другие вопросы по тегам