Unix: “ls -l”命令中设备大小字段的逗号分隔值来自哪里?

3
当我在OS X上运行ls -l /dev时,我会得到以下格式的输出(但有更多的文件):
crw-rw-rw-  1 root       wheel            4, 126 Jun 11 20:28 ttywe
crw-rw-rw-  1 root       wheel            4, 127 Jun 11 20:28 ttywf

据我所知,它只适用于该文件夹,并且我无法找到任何关于那个“4,”的含义。我正在用C重写ls命令,因此我想知道它是什么,如果可能的话,如何在C中检索该值。

1
设备节点没有大小。你所解释的“大小”值是次要编号。 - Charles Duffy
1
顺便说一句 - 这并不特定于该目录; 设备节点也可以存在于其他地方; 将它们放在 /dev 中只是惯例。 (有时出于安全原因强制执行此约定,但这是通过默认关闭的文件系统挂载标志来完成的 - 因为在其他地方拥有设备节点通常很有用,例如用于 chroot)。 - Charles Duffy
1
顺便提一下,权限前面的 c 也很重要(表示这是一个字符设备)。 - Charles Duffy
1个回答

8

来自 POSIX规范中的ls

如果文件是字符特殊文件或块特殊文件,则文件的大小可能会被替换为与所涉及设备相关的实现定义信息。

在这种情况下,您几乎可以肯定有一个实现打印主设备号和次设备号 - 这些值将传递给mknod以创建指向同一设备的文件。然而,并不需要所有实现提供此信息,您的ls实现可以符合标准而没有此信息。


如果您想了解如何在C中实现此操作,一个好的起点是查看man 2 stat。在这个调用填充的struct stat中,你关心的字段是st_rdev。在Linux上,可以通过调用宏MAJOR(stat_result.st_rdev)MINOR(stat_result.st_rdev)(假设您告诉stat将输出写入名为stat_result的结构体中)来提取主要和次要编号。

谢谢!我已经在使用结构体stat来处理权限位和其他内容,所以编写代码应该很容易 :) - dietbacon
1
而且,作为可移植性的注意事项,主要和次要的宏(或函数)在不同平台上的不同时间以大写或小写形式出现,并在不同的头文件(<sys/types.h><sys/mkdev.h><sys/sysmacros.h>等)中找到。使用它们进行编程是非常麻烦的。 - Jonathan Leffler
@JonathanLeffler 非常感谢 :) 在我的 OS X Yosemite 上,<sys/types.h> 中的 major() 和 minor() 对我有用。 - dietbacon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接