我遇到一個問題,第三方應用程式打開了不應該打開的設備節點。
我編寫了一個 SPI 從設備驅動程序,用於對訊息進行一些處理。當驅動程式在“初始化模式”下載入時,它僅回復特定訊息。要重新初始化通信,我必須卸載並重新載入驅動程式。問題是系統有一個以 root 身份運行的第三方應用程序,它打開所有字元設備。使這一切順利進行的唯一方法是停止應用程式並卸載,這會為整個專案帶來巨大的問題。
是否可以在沒有實際設備節點的情況下開啟與字元設備的連接?現在我使用 fopen('/dev/spi') 一切正常,直到我需要重新載入並出現上述問題。是否可以進行任何類型的系統調用,從而在沒有實際 /dev/spi 檔案的情況下產生特定主/次節點號的檔案描述符?
答案1
如果有問題的應用程式僅打開/dev
樹中的設備節點那你可以將你的設備節點放在其他地方,如果它適用於你自己的程式。
設備節點所在的檔案系統必須設定掛載選項,dev
以便對設備節點檔案進行特殊處理。
(免責聲明:我沒有測試過這個,但我以前做過類似的事情...)
tmpfs
例如,一個範例是安裝一個小型檔案系統,/my-dev/
並在那裡建立設備節點。
mkdir -p /my-dev
mount -t tmpfs -o dev,size=<size> tmpfs /my-dev
mknod /my-dev/spi <type> <maj> <min>
在哪裡<size>
是 tmpfs 的大小,<type>
是設備節點類型,<maj> <min>
是主要:次要設備編號;分別參見mount
和的手冊頁mknod
。
....然後fopen("/my-dev/spi")
在您的程式中使用。
(當然,請確保udev
或類似的內容不是為設備建立一個節點。