C语言 在Posix中如何使用类型dev_t?

mrzz3bfm  于 2023-06-21  发布在  其他
关注(0)|答案(5)|浏览(125)

我所追求的是这种类型的含义和什么接口可以使用它。
在Posix规范中解释了dev_t用于设备ID。但是,对于路径所描述的任何对象(可以是文件、directy、fifo或物理设备),device id意味着什么呢?
例如,调用stat()将给予一个包含此类成员的结构;你可以在你的文件系统中统计任何类型的对象。设备ID对于不同的文件类型应该有不同的含义。

eimct9ow

eimct9ow1#

dev_t在绝大多数程序中的唯一用途是确定两个文件名或文件描述符是否引用同一个底层文件。当且仅当两个文件的stat结构的st_inost_dev条目彼此匹配时,这才成立。
基本上,st_dev告诉哪个“设备”(例如安装的分区、网络共享等),并且st_ino是单个设备的上下文中的文件的唯一标识符。

tvmytwxo

tvmytwxo2#

实际上,在struct stat中有两个dev_t类型的字段:

  • st_dev是“包含文件的设备的[d]设备ID”,因此如果两个文件具有相同的st_dev,则它们位于同一个文件系统上。
  • st_rdev是由字符或块特殊文件表示的设备的设备ID,即/dev中常见的文件。它对其他类型的文件没有任何意义。
72qzrwbm

72qzrwbm3#

在内核中,中定义的dev_t类型用于保存设备编号(major/minor)。dev_t是一个32位的量,其中12位用于主号码,20位用于次号码。

e1xvtsh3

e1xvtsh34#

不是问题的答案,只是更新一些关于st_dev的信息

当前glibc(2.35)中的dev_t64位,主要和次要编号为32位。glibc的默认编码是MMMM Mmmm mmmM MMmm,其中Mmajor number的十六进制数字,mminor number的十六进制数字。这与dev_t为16位宽、编码为MMmm的遗留系统向后兼容。它还与Linux内核向后兼容,对于某些体系结构,Linux内核使用32位dev_t,编码为mmmM MMmm。
可以使用major(3)minor(3)来分解dev_t

$ cat main.c
#include <assert.h>
#include <sys/stat.h>
#include <sys/sysmacros.h>
#include <stdio.h>

int main(void)
{
        struct stat buf;
        assert(0 == stat(".", &buf));

        printf("Major device ID: %d\n", major(buf.st_dev));
        printf("Minor device ID: %d\n", minor(buf.st_dev));
}

$ gccs main.c && ./a.out
Major device ID: 0
Minor device ID: 39
flseospp

flseospp5#

st_inost_dev字段一起唯一标识系统中的文件。

设备ID由两部分组成:标识设备的类别的主ID,以及标识该类别中的设备的特定示例的次ID。设备ID使用类型dev_t表示。

相关问题