/dev/hidraw1設備節點存在open("/dev/hidraw1", O_RDONLY)失敗cat /dev/hidraw1可正常輸出數據cat以當前用戶權限運行,而程序可能以不同用戶/上下文運行。檢查設備文件權限:
ls -l /dev/hidraw1
# 輸出示例:crw------- 1 root root 248, 1 Jan 9 10:00 /dev/hidraw1
若權限為600且屬主為root,普通用戶程序無法打開。解決方法:
sudo chmod 666 /dev/hidraw1(重啟失效)udev規則(/etc/udev/rules.d/99-hidraw.rules):
KERNEL=="hidraw*", MODE="0666", GROUP="plugdev"
然後sudo udevadm control --reload && sudo udevadm trigger。HID原始設備可能需要特定標誌:
// 嘗試添加 O_NONBLOCK
int fd = open("/dev/hidraw1", O_RDONLY | O_NONBLOCK);
// 或嘗試讀寫模式
int fd = open("/dev/hidraw1", O_RDWR);
代碼中必須檢查errno:
int fd = open("/dev/hidraw1", O_RDONLY);
if (fd < 0) {
perror("open hidraw1 failed"); // 輸出具體原因:Permission denied / No such device 等
return -1;
}
USB設備重插後節點號可能變化(hidraw0/hidraw1...)。建議通過udev規則創建固定符號鏈接:
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="yyyy", SYMLINK+="my_gamepad"
程序打開/dev/my_gamepad即可。
| 維度 | cat命令 | 自定義程序 |
|---|---|---|
| 運行用戶 | 當前登錄用戶 | 可能不同(服務/守護進程) |
| 打開標誌 | O_RDONLY | 需確認是否一致 |
| 錯誤處理 | 直接顯示 | 需代碼捕獲errno |
90%以上情況是權限不足。請先執行ls -l /dev/hidraw1確認權限,再在代碼中添加perror獲取具體錯誤信息,最後通過udev規則永久解決權限及設備節點固定問題。