我想创build一个字符设备,它具有与标准伪terminal相同的属性,但可以用特定名称命名。
基本上我想有/ dev / pts / my-unique-name而不是可以重用的数字。 有没有办法做到这一点? mknod可以创build任意连接的字符设备吗?
除了一些例外,mknod会起作用。 语法是:
mknod /path/to/new/dev c major minor
所以,例如,你应该可以创build一个新的ptstypes的设备
mknod /tmp/mypts c 136 0
然而,我发现,如果你尝试在/ dev / pts中执行这个操作,你会得到一个拒绝访问信息。 我可以在/ dev中执行,而不是/ dev / pts。 我在一个Centos 5.5框。 因人而异。
这是因为/ dev / pts是由内核挂载的(从我的/ etc / fstab文件中):
devpts /dev/pts devpts gid=5,mode=620 0 0
这是一个内核pipe理的伪文件系统,我不认为这是一个好主意。 在这里创build一个新文件的标准方法是open()ing / dev / ptmx; 这将使得调用进程分配主terminal的fd,并且将创build新设备作为/ dev / pts / X,其中X由ptmx作为从设备dynamic分配。 然后通过一个分叉的过程来打开它自己。
这样做有可能是一个很好的理由。 我不确定它是什么,但是如果系统稳定性是你的价值,我会避免试图打破它。
所有人都说,我提供的第一个带有实际选项的命令行将允许你在/ dev / pts的任何地方创build你自己的pts设备,根据你打算用它做什么,也许这足以让你在哪里你要走了
你所要求的基本上是一个使用BSD伪terminal的用例。 BSD伪terminal设备驱动程序有256对inode数字(每对包含一个主机和一个从机),相应的inode在安装时在/ dev中创build并保留。
内核中没有任何内容强制执行任何特定的命名,但是需要search未使用的对的应用程序通常会对命名有一些期望。
大多数人认为BSD伪随机引入Unix 98terminal已经过时了。 而且似乎有多个Linux发行版已经不再支持BSD pseudoterminals。 但是,如果您可以find一个仍然支持BSD伪terminal的内核,那么您可以使用该支持来创build一对完全符合您要求的设备inode。
mknod /dev/my-master c 2 42 mknod /dev/my-slave c 3 42
请注意,那些必须保持在/dev/pts ,因为/dev/pts是用于Unix 98伪terminal的。
如果您只需要传输字符stream而不需要伪terminal提供的所有其他function,那么使用命名pipe道可能更容易。