리눅스에서 마우스 이벤트는 어떻게 작동합니까?


25

이것은 대부분 호기심에 의한 것입니다. 저는 이벤트 처리가 낮은 수준에서 어떻게 작동하는지 이해하려고 노력하고 있습니다. 그래서 나를 위해 할 소프트웨어를 언급하지 마십시오.

예를 들어 마우스 클릭에 반응하는 프로그램을 C / C ++로 작성하려면 시스템 호출을 사용하여 일부 기능을 커널에 연결해야하거나 마우스 상태를 지속적으로 확인해야한다고 가정합니다. 모르겠어요

C / C ++에서 거의 모든 것이 가능하기 때문에 가능하다고 가정합니다. 낮은 수준이기 때문에 아마도 직접 구현할 필요는 없지만 작동 방식에 주로 관심이 있습니다.

문제는 리눅스에서 어떻게 작동하는지, 특정 시스템 호출, c 라이브러리 등이 있습니까?

답변:


28

Linux에서 마우스를 사용하는 실제 프로그램을 작성하는 경우 X 응용 프로그램을 작성하는 것 같습니다.이 경우 X 서버에 마우스 이벤트를 요청해야합니다. Qt , GTKlibsdl 은 마우스, 키보드, 그래픽, 타이머 및 GUI 프로그램 작성에 필요한 기타 기능에 액세스하는 기능을 제공하는 널리 사용되는 C 라이브러리입니다. Ncurses 는 터미널 응용 프로그램과 비슷한 라이브러리입니다.

그러나 시스템을 탐색하거나 어떤 이유로 든 X를 사용할 수없는 경우 커널 인터페이스에서 작동하는 방식은 다음과 같습니다.

유닉스 철학의 핵심 아이디어는 "모든 것이 파일"이라는 것입니다. 보다 구체적으로, 파일 작업에 사용하는 동일한 시스템 호출을 통해 가능한 많은 것들에 액세스 할 수 있어야합니다. 마우스에 대한 커널 인터페이스는 장치 파일입니다. 당신 open()이 선택적으로 전화 poll()또는 select()수신 데이터가 있는지, 그리고에 대한 read()데이터를 읽을 수 있습니다.

USB 이전의 경우 특정 장치 파일은 종종 직렬 포트 (예 : /dev/ttyS0PS / 2 포트) /dev/psaux였습니다. 마우스에 내장 된 하드웨어 프로토콜을 사용하여 마우스와 대화했습니다. 요즘 /dev/input/*서브 시스템은 다양한 입력 장치를 처리하는 통합 된 장치 독립적 방법을 제공하기 때문에 선호됩니다. 특히, /dev/input/mice시스템에 연결된 마우스의 /dev/input/mouseN이벤트를 제공하고 특정 마우스의 이벤트를 제공합니다. 대부분의 최신 Linux 배포에서 이러한 파일은 마우스를 연결하면 동적으로 만들어집니다.

마우스 장치 파일에서 읽거나 쓰는 것에 대한 자세한 내용은 커널 설명서에서 input / input.txt 로 시작할 수 있습니다 . 특히 3.2.2 (mousedev) 및 3.2.4 (evdev) 섹션과 4 및 5 섹션을 살펴보십시오.


8

일반적으로 하드웨어 장치의 정보는 장치 파일을 통해 응용 프로그램에 노출됩니다 . 마우스의 경우 최신 Linux 시스템에서 장치는 /dev/mice이 장치입니다 (이 장치는 연결된 모든 마우스에서 이벤트를 수집하며 각 개별 마우스에 해당하는 장치도 있습니다).

마우스를 움직이거나 클릭하면 마우스가 컴퓨터에 전기 신호를 보내 인터럽트를 발생 시킵니다. 리눅스 커널에서 인터럽트 핸들러 (interrupt handler) 라고 불리는 코드 는 이벤트 데이터 (예 : 어떤 버튼을 눌렀는지)를 읽고 커널 내부에서 일련의 알림을 트리거합니다.

이 장치에 해당하는 장치 파일에서 읽는 응용 프로그램이있는 경우 해당 응용 프로그램은 입력 대기 중이라는 메시지를받습니다. 예를 들어, 시스템 호출 에서 애플리케이션이 차단 된 경우 시스템 호출이 리턴됩니다.read

일반적인 시스템에는 마우스 이벤트를 읽는 프로세스 인 X Window 서버가 있습니다. 이 프로그램은 그래픽 디스플레이 및 입력 주변 장치를 관리합니다. 그런 다음 일반 그래픽 X 이벤트 프로토콜을 통해 개별 그래픽 응용 프로그램에 마우스 이벤트를 통지합니다. 여기에는 키 누름, 창 포커스 변경, 창 표시 변경 등과 같은 다른 이벤트 유형이 포함됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.