我想訪問一個設備(打開它),該設備的唯一資訊是檔案 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 系統的不同特定方式來執行此操作的方法
uj5u.com熱心網友回復:
與塊設備的直接互動需要一個設備節點。設備節點控制權限(誰可以直接訪問設備)。
理論解決方案:呼叫mknod或mknodat創建S_IFBLK具有給定dev_t值的塊設備()。它需要位于支持設備檔案的檔案系統上。
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 函式,因此您必須手動對其進行編碼。
雖然find可以進行遞回遍歷,但沒有選擇通過設備號匹配設備檔案,這使得定位所需設備不方便。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/353295.html
