从设备中包含的文件中的 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
可以进行递归遍历,但是它没有选择通过设备号匹配设备文件,这使得定位所需设备很不方便。
我想访问一个设备(打开它),该设备的唯一信息是文件统计结构中的 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
可以进行递归遍历,但是它没有选择通过设备号匹配设备文件,这使得定位所需设备很不方便。