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

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

이것은 대부분 호기심에서 비롯된 것입니다. 저는 낮은 수준에서 이벤트 처리가 어떻게 작동하는지 이해하려고 노력하고 있으므로 이 작업을 수행할 수 있는 소프트웨어를 추천하지 마십시오.

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

C/C++에서는 거의 모든 것이 가능하기 때문에 가능하다고 생각하며, 수준이 너무 낮기 때문에 작동 방식에 가장 관심이 있지만 직접 구현할 필요는 없을 것입니다.

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

답변1

Linux에서 마우스를 사용하는 실제 프로그램을 작성하는 경우 X 응용 프로그램을 작성할 가능성이 높습니다. 이 경우 X 서버에 마우스 이벤트를 요청해야 합니다. Qt,GTK, 그리고라이브러리 파일GUI 프로그램 작성에 필요한 마우스, 키보드, 그래픽, 타이머 및 기타 기능에 대한 액세스를 제공하는 널리 사용되는 C 라이브러리입니다. Ncurses유사한 터미널 애플리케이션 라이브러리입니다.

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

UNIX 철학의 핵심 아이디어는 "모든 것이 파일이다"입니다. 보다 구체적으로 말하면, 파일을 처리하는 데 사용되는 것과 동일한 시스템 호출을 통해 가능한 한 많은 콘텐츠에 액세스해야 합니다. 따라서 마우스의 커널 인터페이스는 장치 파일입니다. open()전화를 걸 poll()거나 select()들어오는 데이터가 있는지 확인하고 read()데이터를 읽을 수 있습니다 .

USB 시대 이전에는 특정 장치 파일은 일반적으로 직렬 포트(예 /dev/ttyS0: PS/2 포트) 였습니다 /dev/psaux. 마우스에 내장된 하드웨어 프로토콜을 사용하여 마우스와 통신할 수 있습니다. 오늘날 /dev/input/*하위 시스템은 다양한 입력 장치를 처리할 수 있는 통합되고 장치 독립적인 방법을 제공하기 때문에 선호됩니다. 특히, /dev/input/mice시스템에 연결된 모든 마우스의 이벤트가 제공되며, /dev/input/mouseN특정 마우스의 이벤트도 제공됩니다. 대부분의 최신 Linux 배포판에서는 마우스를 연결하면 이러한 파일이 동적으로 생성됩니다.

마우스 장치 파일에서 읽거나 쓸 내용에 대한 자세한 내용은 다음을 참조하세요.입력/input.txt커널 문서에서. 특히 섹션 3.2.2(mousedev) 및 3.2.4(evdev)와 섹션 4 및 5를 참조하세요.

답변2

일반적으로 하드웨어 장치의 정보는 다음과 같은 방식으로 애플리케이션에 노출됩니다.장치 파일. 마우스의 경우 최신 Linux 시스템에서 이 장치는 다음과 같습니다 /dev/mice(이 장치는 연결된 모든 마우스에 대한 이벤트를 수집하며 각 개별 마우스에 해당하는 장치도 있습니다).

마우스를 움직이거나 클릭하면 마우스가 컴퓨터에 전기 신호를 보내 컴퓨터가방해하다. Linux 커널의 코드 조각은 다음과 같습니다.인터럽트 핸들러이벤트 데이터는 순차적으로 읽혀지며(예: 어떤 버튼을 눌렀는지 등) 커널 내에서 일련의 알림을 트리거합니다.

응용 프로그램이 이 장치에 해당하는 장치 파일을 읽고 있는 경우 입력이 보류 중이라는 알림이 응용 프로그램에 전달됩니다. 예를 들어, 애플리케이션이 다음에서 차단된 경우read 시스템 호출, 그런 다음 시스템 호출이 반환됩니다.

일반적인 시스템에는 마우스 이벤트를 읽는 프로세스가 있습니다.X 윈도우 서버. 이 프로그램은 그래픽 디스플레이와 입력 주변 장치를 관리합니다. 그런 다음 각 그래픽 응용 프로그램은 일반 X 이벤트 프로토콜을 통해 마우스 이벤트에 대한 알림을 받습니다. 이 프로토콜은 키 누르기, 창 초점 변경, 창 가시성 변경 등과 같은 다른 이벤트 유형을 전달합니다.

관련 정보