【问题标题】:Find device file from the st_dev field in a file contained in the device从设备包含的文件中的 st_dev 字段中查找设备文件
【发布时间】:2021-12-21 12:16:15
【问题描述】:

我想访问一个设备(打开它),该设备的唯一信息是文件 stat 结构中的 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 系统上使用不同的特定方式

【问题讨论】:

  • 我认为在 POSIX 中没有任何方法可以做到这一点。您也许可以使用 Linux 特定的操作来做到这一点。
  • 我也很想找到一种方法来使用 Linux 特定的操作
  • @Barmar stackoverflow.com/questions/57642729/… 不是重复的。不仅因为它适用于 Linux,还因为它只是定位一个包含设备元数据的位置,而不是一个允许访问块设备内容的位置。
  • 我假设(错误地)元数据将包括设备路径或挂载信息。 @Gilles'SO-stopbeingevil'

标签: c posix stat block-device


【解决方案1】:

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

理论解决方案:调用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 可以进行递归遍历,但它没有通过设备号匹配设备文件的选项,这使得定位所需设备不方便。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    相关资源
    最近更新 更多