Udev 이벤트 큐에 이벤트 추가

Udev 이벤트 큐에 이벤트 추가

내 udev 규칙 중 하나가 USB 저장 장치를 제거하는 스크립트를 실행합니다. 이 스크립트는 몇 가지 일반적인 정리를 수행하고 저장 장치의 마운트 지점 디렉터리를 삭제합니다. 문제는 USB 플래시 드라이브가 핫플러그에 의해 제거될 때 트리거하는 대신 C++ 응용 프로그램에서 프로그래밍 방식으로 이 논리를 트리거할 수 있기를 원한다는 것입니다. 너무 늦어 보입니다.

이를 달성하는 올바른 방법은 이벤트를 udev 이벤트 큐에 직접 추가하는 것 같습니다. udevadm을 사용하여 원하는 것을 달성할 수 있었지만 libudev 라이브러리에 이에 상응하는 API가 표시되지 않습니다.

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

이를 달성하기 위해 dbus를 통해 udev에 액세스할 수 있는 방법이 있습니까? 이 작업을 수행할 수 있는 라이브러리가 있나요? 이것이 궁극적으로 udev가 작동하는 방식이 아닌가? udev가 수행하도록 하는 대신 애플리케이션에서 블록 장치를 마운트 해제하고 정리해야 합니까?

답변1

당신이 찾고 있는 것은 sysfs 파일 시스템 uevent에 있는 의사 파일 인 것 같습니다 /sys.

"remove"커널은 이 파일(예: )에 명령을 작성하여 이러한 명령을 장치 이벤트에 대한 사용자 공간 처리기(예: udevd)로 전달합니다.

따라서 다음 코드 조각(셸을 예로 사용)과 동일한 작업을 수행하면 udev에 장치 삭제를 요청하여 원하는 결과를 얻을 수 있습니다 /dev/sda1.

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

libudev API를 사용할 수 있습니다(예:udev_device_get_syspath(3)특정 장치에 대한 올바른 sysfs 경로를 찾는 데 도움이 됩니다.

아래 커널에 대한 문서를 찾을 수 있습니다.물체.

udev 문서에서 "systemd-udevd가 커널 uevents를 수신합니다"와 같은 "uevents"에 대한 언급을 찾을 수도 있습니다.udevd 매뉴얼 페이지.

uevent하지만 sysfs 의사 파일에 관한 문서는 많지 않은 것 같습니다 .

관련 정보