从设备中包含的文件中的 st_dev 字段查找设备文件

Find device file from the st_dev field in a file contained in the device

我想访问一个设备(打开它),该设备的唯一信息是文件统计结构中的 st_dev 字段。

int fd;
char *path;
struct stat buf;
stat("/path/to/my/file", &buf);
// do some things with buf.st_dev
// then either path contains a path to the device refered by st_dev or fd contains a file descriptor refering to it.

我想找到一种方法以 POSIX 可移植的方式或至少 Linux 和 MacOS 系统

的不同特定方式来做到这一点

与块设备的直接交互需要设备节点。设备节点控制权限(谁可以直接访问设备)。

理论解决方案:调用mknod or mknodat 以给定的dev_t 值创建一个块设备(S_IFBLK)。它需要在支持设备文件的文件系统上。

mknod("/var/run/myprogram/mydevice", S_IFBLK | S_IRUSR | S_IWUSR, buf.st_dev);

这需要更高的权限:典型的 root 权限。在 Linux 上,CAP_MKNOD 能力就足够了,但一些安全框架甚至可能会阻止 root 在随机位置创建设备节点。我不知道这是否需要 macOS 上的 root 权限。

确保不要让非特权程序访问设备。

实际解决方案:在 /dev 下寻找合适的设备,即块设备 ((found_stat.st_mode & S_IFBLK) != 0) 使得 found_stat.st_rdev == buf.st_dev。没有执行递归搜索的 POSIX C 函数,因此您必须 code it manually.

虽然find可以进行递归遍历,但是它没有选择通过设备号匹配设备文件,这使得定位所需设备很不方便。