장치가 인터럽트를 발생시키는 경우 프로그래밍 방식으로 어떻게 감지할 수 있나요? 이는 장치가 연결되거나 연결 해제될 때 발생할 수 있습니다.
다음과 같은 상황도 있습니다. 예를 들어 지문 스캐너에 손가락을 대면 인터럽트가 발생합니다. 이 인터럽트를 어떻게 감지하고 포착할 수 있나요?
이벤트가 발생할 때(예: CD 삽입 또는 펜 드라이브 삽입) 이러한 장치에서 발생한 인터럽트를 캡처하고 이를 사용하여 내 애플리케이션에서 이러한 장치와 관련된 작업을 수행할 수 있도록 Gtkmm을 사용하여 애플리케이션을 작성하고 싶습니다.
Gtkmm에서 수행할 수 없는 경우 낮은 수준에서 인터럽트를 포착하여 Gtkmm 애플리케이션에 알릴 수 있나요?
GParted가 어떻게 작동하는지 확인하고 있습니다. 처음에 나타 났고 /dev/sda
펜 드라이브를 연결하면 자동으로 files
앱이 열렸습니다. GParted를 확인하면 장치의 드롭다운 메뉴에 펜 드라이브가 존재하지 않습니다. GParted 메뉴에서 "장치 새로 고침" 또는 +를 선택한 경우 Ctrl에만 나타납니다 R.
답변1
더 낮은 수준에서 인터럽트를 포착하고 gtkmm 애플리케이션에 알릴 수 있습니다.
아니요, 그건커널 공간활동. 다행스럽게도 커널은 사용자 공간에서 액세스할 수 있는 인터페이스를 통해 특정 이벤트의 결과를 보고합니다.
귀하의 질문은 블록 장치가 연결된 때 또는 파일 시스템이 마운트된 때를 감지하려는지(전자 쪽으로 기울고 있는 것처럼 보이지만) 약간 모호합니다. 시스템이 자동 마운트(보통 기본적으로)를 사용하는 경우 블록 장치가 연결될 때 파일 시스템을 마운트합니다. 그렇지 않으면 수동으로 수행해야 합니다(예: 를 사용하여 mount
).
어느 쪽이든 커널을 폴링/구문 분석/스캔하고 싶습니다.파일 노드인터페이스를 기반으로 합니다. 나는 이전 /dev/
에 연결된 블록 장치와 마운트된 파일 시스템을 전달하고 추적하는 애플리케이션(실제로는 C++ GTK 애플리케이션)에서 이 작업을 수행한 적이 있습니다 /etc/mtab
. 이는 언어에 구애받지 않는 간단한 접근 방식입니다. 어떤 사람들은 이것이 파일/디렉터리 읽기를 포함하기 때문에 처음에는 약간 불쾌하다고 생각하지만 이러한 인터페이스는 실제로 디스크에 존재하지 않으므로 과도한 I/O 오버헤드가 없으며 read()
시스템 호출이라는 점을 기억하십시오. 커널 인터페이스에서 파일 노드를 읽는 것은 listAttachedDevices()
언어 독립적이라는 점을 제외하면 스타일 API와 동일합니다 . 이러한 노드에서 데이터를 읽으면 커널은 해당 노드가 나타내는 정보를 직접 전달합니다.
이 /dev
디렉토리에는 연결된 장치가 특수 장치 노드 파일로 나열됩니다 /dev/sda
. 예를 들어 장치가 연결 및 연결 해제되면 커널에 의해 추가 및 제거되므로 주기적으로(예: 5초마다) 폴링하여 추적하면 새 장치와 장치 노드를 감지할 수 있습니다. 삭제된 콘텐츠. 여기서 유일한 복잡한 점은 콜백 스타일 API가 없기 때문에 실제로 지속적으로 확인하려면 이에 대한 자체 스레드를 만들어야 한다는 것입니다(왜 gparted
클릭해야 할 수도 있습니다 Refresh Devices
).
더 나은 대안 /dev
은 과 (아래 참조) 사이에 상당한 차이가 있거나 후자의 노드에 다음이 포함되어 있다는 점에 /sys/block
유의하십시오./dev
/proc
/sys
관련 정보장치와 같은 것, 노드 /dev
는장치에 대한 실제 연결(따라서 를 스캔하는 경우 /dev
개별 파일을 읽지 말고 파일이 존재한다는 점만 참고하세요.)
/etc/mtab
지금은심볼릭 링크(참조) -s
;는 커널 인터페이스의 주요 스위스 군용 칼입니다(참고자료 참조). 이 목록man ln
/proc/self/mounts
/proc
man proc
마운트된 파일 시스템;자동 마운트를 사용하면 사물을 연결/분리할 때 사물이 나타나고 사라집니다. /proc
및 의 정보는 /sys
일반적으로 ASCII 텍스트 형식이므로 cat
등을 사용하여 이러한 파일을 볼 수 있고 string(stream) 함수를 사용하여 구문 분석할 수 있습니다.
WRT는 다른 유형의 장치(예: 지문 스캐너)에 대한 /sys
좋은 시작점입니다. 및 디렉토리가 /sys/dev
포함되어 있습니다 . 블록 장치는 일반적으로 해당 장치에 대한 정보를 저장합니다.block
char
무작위 액세스. Char 장치는 스캐너, 카메라, HID 장치(마우스 및 키보드와 같은 휴먼 인터페이스 장치)를 포함하여 스트림 형태로 시스템과 정보를 교환합니다. 나는 gtkmm이좀 고급스러운 것들추가 HID 항목의 경우 아마도 GUI와의 상호작용에 중요하기 때문일 것입니다.