mknod中的u和c有区别吗

use*_*456 6 linux devices linux-kernel character-special-files

man mknodLinux上:

 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 兼容,因为mknodGNU Fileutils 中早于 Linux 本身,¹ 并且 GNU 的这个特性mknod可以追溯到第一个版本控制的签入mknod.c,但是我还没有找到任何 Unix 的文档,它们将接受u作为 的参数mknod(1),因此该假设不成立。²


旁白:

  1. mknod1991 年 7 月,一个实用程序被添加到 GNU Fileutils。Linux 内核的第一个版本直到 1991 年 9 月才发布到 Usenet。这告诉我们,GNU 的第一个版本mknod必须从一开始就支持非 Linux 操作系统。

  2. 我检查了SolarisHP-UXAIXFreeBSDSCO OpenServerSCO UnixWareMinix 2Ultrix2.11BSDOS X的在线手册页。

    您会发现mknod u其他操作系统(例如Minix 3)的文档,但这仅仅是因为它们也使用mknod(1). 另一个奇怪的是现代 Solaris,它同时提供 AT&Tmknod和 GNU mknod,分别在手册部分 1m(上面链接)和部分 1g 中单独记录。