systemd+agetty+login+bash에서 Ctr+C를 intr 신호에 매핑하는 작업을 담당하는 프로세스는 무엇입니까?

systemd+agetty+login+bash에서 Ctr+C를 intr 신호에 매핑하는 작업을 담당하는 프로세스는 무엇입니까?

어떤 프로세스가 이러한 매핑을 담당하는지 이해하기 위해 소스 코드를 읽어보았지만 여전히 알 수 없습니다. 누구든지 이것과 관련된 코드를 말해 줄 수 있습니까?

소스 코드: agetty+login(util-linux 프로젝트), 체계

답변1

이 매핑을 담당하는 프로세스는 없습니다. 이는 커널의 일부인 장치 드라이버 기능이며 ctrl-c기본값은 .

ctrl-ctty(또는 pty) 장치에 매핑되고 SIGINT터미널을 제어하는 ​​포그라운드 프로세스로 전송됩니다.

Systemd는 agetty를 tty 장치에 연결하고 이를 시작한 다음 agetty는 tty 장치를 초기화하고(sty 또는 tcsetattr의 시스템 호출 버전을 사용하여) 입력을 기다린 후 결국 로그인을 실행합니다.

예를 들어, tcsetattr을 사용하는 경우 c_cctty가 작업(줄 편집 및 신호 및 기타 사항 포함)에 매핑하는 특수 문자 배열과 기본값 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. 이는 커널이 기본적으로 이 작업을 수행한다는 의미입니다.

관련 정보