어떤 프로세스가 이러한 매핑을 담당하는지 이해하기 위해 소스 코드를 읽어보았지만 여전히 알 수 없습니다. 누구든지 이것과 관련된 코드를 말해 줄 수 있습니까?
소스 코드: agetty+login(util-linux 프로젝트), 체계
답변1
이 매핑을 담당하는 프로세스는 없습니다. 이는 커널의 일부인 장치 드라이버 기능이며 ctrl-c기본값은 .
ctrl-ctty(또는 pty) 장치에 매핑되고 SIGINT
터미널을 제어하는 포그라운드 프로세스로 전송됩니다.
Systemd는 agetty를 tty 장치에 연결하고 이를 시작한 다음 agetty는 tty 장치를 초기화하고(sty 또는 tcsetattr의 시스템 호출 버전을 사용하여) 입력을 기다린 후 결국 로그인을 실행합니다.
예를 들어, tcsetattr을 사용하는 경우 c_cc
tty가 작업(줄 편집 및 신호 및 기타 사항 포함)에 매핑하는 특수 문자 배열과 기본값 VINTR
을 포함하는 tty에 termios 구조를 적용합니다. ctrl-ctty가 이러한 문자를 해석하도록 허용합니다.
잠시 후, 애플리케이션(예: bash, vim 또는 emacs)도 termios를 조작하고 모드 비트를 변경하여 줄 편집 문자를 비활성화(그런 다음 에뮬레이트)하거나 문자 그대로 읽고 사용할 수 있도록 일부 또는 전체 중단 문자를 비활성화할 수도 있습니다. 응용 프로그램의 필요에 따라.
답변2
기본 신호 매핑은 이전 프로세스(init, agetty, login 또는 bash)가 아닌 Linux 커널에 의해 처리되는 것 같습니다.
그러나 관련 라이브러리를 통해 설정/가져올 수 있습니다 termios
.
내 가설을 검증하기 위해 간단한 테스트 프로그램(test.c)을 작성하고 이를 커널이 호출하는 첫 번째 프로세스로 만들었습니다(init처럼). 코드는 아래와 같이 표시됩니다.
/* test.c */
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
int main(int argc, char **argv)
{
struct termios ts;
tcgetattr(STDIN_FILENO, &ts);
printf("INTR: %u\nSUSP: %u\n", ts.c_cc[VINTR], ts.c_cc[VSUSP]);
return 0;
}
그런 다음 프롬프트에 따라 init
시스템을 다시 시작하면 프로그램이 표시됩니다.
INTR: 3
SUSP: 26
이 두 값은 각각 ^C
및 에 해당합니다 ^Z
. 이는 커널이 기본적으로 이 작업을 수행한다는 의미입니다.