키보드에서 신호를 수신하는 응용 프로그램은 누가 결정합니까?

키보드에서 신호를 수신하는 응용 프로그램은 누가 결정합니까?

터미널 키보드 신호에 대한 나의 현재 이해는(주로 내가 관찰한 내용을 Google에서 찾을 수 있는 내용에 매핑하려는 노력을 기반으로 함) 다음과 같습니다.

  • 사용자가 CC를 누릅니다.
  • c의 7비트 ASCII 값에서 가장 왼쪽 2비트를 지워서 계산된 바이트로 터미널의 입력 버퍼에 전송됩니다.

그 후에는 어떤 입력이 터미널(stty)에서 수행되는 신호를 의미하는지 구성하기 때문에 매우 모호해지기 시작합니다. 나는 이것이 터미널 자체가 프로세스에 신호를 보내고 있음을 의미한다고 생각합니다. 하지만 터미널이 그것을 읽고 있는 애플리케이션을 인식하지 못한다고도 생각합니다.

터미널의 키보드를 통해 신호가 한쪽 끝에서 다른 쪽 끝으로 어떻게 전송됩니까?

답변1

C눌렀을 때 누르면 Ctrl키 누르기가 터미널 에뮬레이터로 전송되고, 그런 다음 keyrelease X11 이벤트가 전송됩니다.

이 이벤트(일반적으로 키 누르기 이벤트)가 발생하면 터미널 에뮬레이터는 ^C의사 tty 장치의 마스터 측 파일 설명자에 0x3바이트( )를 씁니다.

isig장치의 termios 설정이 켜져 있고 이 설정이 0x3바이트로 설정된 경우 intr커널은 장치의 모든 구성원에게 SIGINT 신호를 보냅니다.포그라운드 프로세스 그룹터미널 장치의 속성(pty 장치에 저장된 또 다른 속성)입니다. 이 경우 0x3 바이트는 pty의 슬레이브 측에서 읽혀지지 않습니다.

일반적으로 대화형 쉘은 setpgid()쉘 작업에 대한 프로세스 그룹을 생성하고( 사용) 어떤 프로세스 그룹을 전경으로 가져올지 결정합니다( tcsetpgrp()pty 장치의 이 속성 사용).

예를 들어, 대화형 셸의 프롬프트에서 실행하는 경우:

foo | bar

쉘은 두 개의 프로세스를 포함하는 새로운 프로세스 그룹을 시작하고(그 안에서 실행하고 표준 입력/출력을 파이프한 후 foo) bar그룹을 전면으로 가져옵니다. Ctrl-C를 누르면 두 프로세스 모두 SIGINT를 수신합니다.

존재하다:

foo | bar &

동일하지만 프로세스 그룹은 전경으로 가져오지 않습니다(그리고 쉘은 이를 기다리지 않으므로 다른 명령을 입력할 수 있습니다). 이러한 프로세스는 Ctrl-C를 통해 SIGINT를 얻지 못하지만 tty 장치에서 읽으려고 하면 중단될 수 있습니다.

추가 자료:각 PTY(의사 터미널) 구성 요소(소프트웨어, 마스터 측, 슬레이브 측)의 역할은 무엇입니까?

관련 정보