首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Linux下open()打不開/dev/hidraw1設備,但cat能讀取數據的排查思路

     編輯:程式設計綜合問答

問題現象

  • USB手柄插入後,/dev/hidraw1設備節點存在
  • 程序調用open("/dev/hidraw1", O_RDONLY)失敗
  • 終端執行cat /dev/hidraw1可正常輸出數據

核心排查方向

1. 權限問題(最常見)

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。

2. 打開方式標誌位

HID原始設備可能需要特定標誌:

// 嘗試添加 O_NONBLOCK
int fd = open("/dev/hidraw1", O_RDONLY | O_NONBLOCK);

// 或嘗試讀寫模式
int fd = open("/dev/hidraw1", O_RDWR);

3. 獲取具體錯誤碼

代碼中必須檢查errno:

int fd = open("/dev/hidraw1", O_RDONLY);
if (fd < 0) {
    perror("open hidraw1 failed");  // 輸出具體原因:Permission denied / No such device 等
    return -1;
}

4. 設備節點動態變化

USB設備重插後節點號可能變化(hidraw0/hidraw1...)。建議通過udev規則創建固定符號鏈接:

SUBSYSTEM=="hidraw", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="yyyy", SYMLINK+="my_gamepad"

程序打開/dev/my_gamepad即可。

調試對比:cat vs 程序

維度cat命令自定義程序
運行用戶當前登錄用戶可能不同(服務/守護進程)
打開標誌O_RDONLY需確認是否一致
錯誤處理直接顯示需代碼捕獲errno

總結

90%以上情況是權限不足。請先執行ls -l /dev/hidraw1確認權限,再在代碼中添加perror獲取具體錯誤信息,最後通過udev規則永久解決權限及設備節點固定問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved