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


16

터미널에서 키보드의 신호에 대한 나의 현재 이해는 (내 관찰 내용을 Google에서 찾을 수있는 것에 매핑하려는 시도에 주로 근거를두고 있음)입니다.

  • 사용자가 Cc를 누름
  • 이것은 c의 7 비트 ASCII 값에서 가장 왼쪽의 2 비트를 클리어하여 계산 된 바이트로 터미널의 입력 버퍼에 전송됩니다.

그 후 입력이 무슨 신호를 터미널 (stty)에서 수행 하는지를 의미하기 때문에 안개가 자욱하기 시작합니다. 터미널 자체가 프로세스에 신호를 보내고 있음을 의미한다고 가정합니다. 그러나 나는 또한 그 터미널이 그것을 읽는 응용 프로그램에 대해 알지 못합니다.

터미널에서 키보드로 신호를 보내는 것은 끝에서 끝까지 어떻게 작동합니까?


1
이 아니라 그 자체로 대답하지만, 가치가 읽기 : 청각 장애는 신화화 LFT에 의해.
duskwuff

답변:


33

가압 C하면서 Ctrl가압하는 단말기 에뮬레이터 keyrelease X11 이벤트 뒤에 누르기를 보낸다.

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

isig장치 의 termios 설정이 켜져 있고 intr설정이 0x3 바이트로 설정되어 있으면 커널은 터미널 장치 의 포 그라운드 프로세스 그룹 의 모든 구성원 (pty 장치에 저장된 다른 속성 )으로 SIGINT 신호를 보냅니다 . 이 경우 pty의 슬레이브 쪽에서 0x3 바이트를 읽을 수 없습니다.

일반적으로 setpgid()쉘 작업에 대한 프로세스 그룹 (with )을 작성 하고 포 그라운드로 넣을 ( tcsetpgrp()pty 장치의 해당 속성을 설정 하기 위해) 결정하는 대화식 쉘입니다 .

예를 들어 대화식 쉘 프롬프트에서 실행할 때 :

foo | bar

쉘은 두 개의 과정에 새로운 프로세스 그룹을 시작 (여기서는 실행 foobar파이프와 그 표준 입력 / 출력에 접속 한 후) 및 그 전경 둔다 기이다. Ctrl-C를 누르면 두 프로세스 모두 SIGINT를 수신합니다.

에:

foo | bar &

동일하지만 프로세스 그룹이 포 그라운드로 배치되지 않습니다 (쉘도 대기하지 않으므로 다른 명령을 입력 할 수 있습니다). 이러한 프로세스는 Ctrl-C에서 SIGINT를 얻지 못하지만 tty 장치에서 읽으려고하면 일시 중지 될 수 있습니다.

추가 자료 : 각 PTY (Pseudo-Terminal) 구성 요소 (소프트웨어, 마스터 측, 슬레이브 측)의 책임은 무엇입니까?


2
풍부한 답변에 감사드립니다. 나는 그것을 이해하기 위해 답의 핵심을 바꾸려고 노력할 것입니다 : 신호는 커널에 의해 전송됩니다. 커널은 장치 속성에 구성된 입력에 대해 tty 장치 자체를 모니터링하고 있습니다 (구성하려는 사람에 의해) 커널은 장치 속성 (주로 셸에 의해 세션 리더의 역할 중 하나)에 구성된 프로세스 그룹으로 전송합니다. 이것이 정확하기를 바랍니다.
calavera.info

1
@ calavera.info, 예 맞습니다. 직렬 케이블 끝에있는 실제 터미널의 경우 커널은 와이어에서 나오는 0x3 바이트를 찾고 있습니다. 의사 터미널의 경우 마스터 측이 와이어를 대체합니다. 그리고 커널은 터미널 에뮬레이터가 보낸 0x3 바이트를 찾고 있습니다. 커널 처리가 장치가 "터미널"장치 (터미널 라인 원칙 ) 로 사용될 때 수행되는 모듈 식 설계의 일부라는 사실과 같이 다른 Q & A에 대한 링크가있는 편집을 참조하십시오 .
Stéphane Chazelas

문제는 말하지 않았다 터미널 이 아닌 터미널 에뮬레이터를 ? 에뮬레이터의 기능이 가능한 한 터미널처럼 작동하는 것을 고려하면 큰 차이가 있다고 생각하지 않습니다 ...
Toby Speight

2
@Toby, 그렇습니다. 요즘 아무도 실제 터미널을 사용하는 사람이 거의 없기 때문에 OP는 터미널 에뮬레이터를 의미한다고 가정했습니다 (많은 것을 "터미널"이라고 함). 자세한 내용은 귀하의 위의 의견과 연결된 Q & A를 참조하십시오.
Stéphane Chazelas

1
@TobySpeight 예, 직렬 회선을 통해 실제 터미널을 다루기 때문에 터미널에 대해 묻고 있었지만 대답과 다음 주석은 두 경우 모두에 완전히 유효했습니다.
calavera.info
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.