我想创建一个具有与标准伪终端相同属性但可以以特定名称命名的字符设备。
基本上,我希望使用 /dev/pts/my-unique-name 而不是可以重复使用的数字。有办法吗?mknod
例如,可以创建任意连接的字符设备吗?
答案1
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,并且取决于您打算用它做什么,也许这足以让您到达目的地。
答案2
你所要求的本质上是一个使用案例BSD 伪终端。BSD 伪终端设备驱动程序有 256 对 inode 编号(每对由一个主节点和一个从节点组成),并且相应的 inode 在安装时在 /dev 中创建并保留。
内核中没有任何内容强制执行任何特定的命名,但是需要搜索未使用的对的应用程序通常会对命名有一些期望。
大多数人认为,随着 Unix 98 伪终端的引入,BSD 伪终端已经过时了。而且似乎有多个 Linux 发行版都不再支持 BSD 伪终端。但是,如果您能找到一个仍然支持 BSD 伪终端的内核,那么您可以使用该支持来创建一对与您要求完全相同的设备 inode。
mknod /dev/my-master c 2 42
mknod /dev/my-slave c 3 42
请注意,这些必须保持在之外/dev/pts
,就像/dev/pts
Unix 98 伪终端一样。
如果您只需要传输字符流而不需要伪终端提供的所有其他功能,那么使用命名管道可能会更容易。