use*_*456 6 linux devices linux-kernel character-special-files
从man mknod
Linux上:
c, u create a character (unbuffered) special file
Run Code Online (Sandbox Code Playgroud)
为什么同一个函数有两个字母?有什么细微的差别,还是完全一样?
War*_*ung 13
它们是相同的,至少在 Linux 上是这样。
我得出了这个结论,首先看源代码mknod(1)
在GNU的coreutils,其中在当前版本线217,我们发现,'c'
与'u'
案件的处理是完全相同,得到同样的设备类型。该S_IFCHR
值在 Linux 内核头文件中定义,但该值并不重要。重要的是相同的值被存储在文件系统的开发节点中。
我通过一个简单的测试解决了这个问题:
$ sudo mknod /dev/null2 u 1 3
$ ls -l /dev/null*
crw-rw-rw- 1 root root 1, 3 Jan 12 2015 /dev/null
crw-r--r-- 1 root root 1, 3 Oct 19 22:56 /dev/null2
Run Code Online (Sandbox Code Playgroud)
u
命令中的A给出与c
. 案件结案。
至于为什么允许这两个字符,我最好的猜测是,它只是那些认为b
“缓冲”而不是“块”的人的别名,因此您需要u
将其相反,意思是“无缓冲”,而不是c
“特点。”
我最初认为 GNU 的这个特性mknod
可能是为了与某些前 Linux 版本的 Unix 兼容,因为mknod
在GNU Fileutils 中早于 Linux 本身,¹ 并且 GNU 的这个特性mknod
可以追溯到第一个版本控制的签入mknod.c
,但是我还没有找到任何 Unix 的文档,它们将接受u
作为 的参数mknod(1)
,因此该假设不成立。²
旁白:
mknod
1991 年 7 月,一个实用程序被添加到 GNU Fileutils。Linux 内核的第一个版本直到 1991 年 9 月才发布到 Usenet。这告诉我们,GNU 的第一个版本mknod
必须从一开始就支持非 Linux 操作系统。
我检查了Solaris、HP-UX、AIX、FreeBSD、SCO OpenServer、SCO UnixWare、Minix 2、Ultrix、2.11BSD和OS X的在线手册页。
您会发现mknod u
其他操作系统(例如Minix 3)的文档,但这仅仅是因为它们也使用mknod(1)
. 另一个奇怪的是现代 Solaris,它同时提供 AT&Tmknod
和 GNU mknod
,分别在手册部分 1m(上面链接)和部分 1g 中单独记录。