从man mknod
Linux 上:
c, u create a character (unbuffered) special file
为什么同一个功能有2个字母?有什么细微的差别,还是完全相似?
答案1
至少在 Linux 上它们是相同的。
我首先查看了以下内容得出了这个结论源代码mknod(1)
在里面GNU 核心工具,在当前版本的第 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
u
命令中的A给出与 相同的开发节点c
。案件结案。
至于为什么这两个字符都是允许的,我最好的猜测是,对于那些认为b
含义是“缓冲”而不是“块”的人来说,它只是一个别名,因此您需要u
作为它的反义词,意思是“无缓冲”,而不是c
“字符”。
我最初认为 GNU 的这个特性mknod
可能是为了与 Linux 之前版本的 Unix 兼容,mknod
因为GNU 文件工具GNU 的这一特性mknod
可以追溯到Linux 本身之前的第一个版本控制签入mknod.c
,但我还没有找到任何 Unix 可以接受u
作为 的参数的文档mknod(1)
,因此该假设不成立。²
旁白:
1991 年 7 月,GNU Fileutils 中添加了一个
mknod
实用程序。直到 1991 年 9 月,Linux 内核的第一个版本才发布到 Usenet。这告诉我们,GNU 的第一个版本mknod
从一开始就必须支持非 Linux 操作系统。我检查了在线手册页索拉里斯,惠普-UX,AIX,自由BSD,SCO开放服务器,SCO UnixWare,迷你克斯2,乌尔特里克斯,2.11BSD, 和操作系统。
您会发现
mknod u
其他操作系统的文档 - 例如迷你克斯3— 但这只是因为他们还使用mknod(1)
.另一个奇怪之处是现代 Solaris,它同时提供 AT&Tmknod
和 GNUmknod
,分别在手册第 1m 部分(上面链接)和第 1g 部分中分别记录。