Udev

將事件添加到 Udev 事件隊列

  • January 10, 2019

我的 udev 規則之一執行刪除 USB 儲存設備的腳本。此腳本執行一些正常清理並刪除儲存設備的掛載點目錄。問題是我希望能夠從我的 C++ 應用程序中以程式方式觸發此邏輯(而不是當 USB 快閃記憶體驅動器被熱插拔移除時,這似乎為時已晚)。

實現這一點的正確方法似乎是直接將事件添加到 udev 事件隊列中。我能夠使用 udevadm 實現所需的操作,但在 libudev 庫中看不到等效的 API。

udevadm trigger --action=remove --property-match=DEVNAME=/dev/sda1

有沒有辦法通過 dbus 訪問 udev 來實現這一點?有圖書館可以讓我這樣做嗎?這最終不是 udev 應該如何工作的嗎?我應該在我的應用程序中解除安裝和清理塊設備而不是讓 udev 去做嗎?

您正在尋找的似乎是sysfs 文件系統uevent中的偽文件。/sys

通過將命令寫入該文件(例如"remove"),核心會將這些命令轉發給設備事件的使用者空間處理程序,即 udevd。

因此,執行與以下程式碼段等效的操作(以 shell 為例)應該可以滿足您的要求,請求 udev 刪除/dev/sda1設備:

# echo -n "remove" >/sys/class/block/sda1/uevent

您可以使用 libudev API(例如,udev_device_get_syspath(3)來幫助您找到給定設備的正確 sysfs 路徑。

您可以在kobject下找到核心方面的一些文件。

您還可以在 udev 的文件中找到“uevents”的一些提及,例如udevd 的手冊頁中的“systemd-udevd 偵聽核心 uevents” 。

但是在任何地方似乎都沒有很多關於ueventsysfs 偽文件的文件……

引用自:https://unix.stackexchange.com/questions/493803