내 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 의사 파일에 관한 문서는 많지 않은 것 같습니다 .