시그널은 프로세스나 특정 스레드에 전달되는 비동기 알림입니다. 이벤트를 보고하고 동작을 요청하지만 데이터 중심 프로세스 간 통신 메커니즘과 비교해 전달하는 정보는 제한적입니다.
프로세스 · 레슨 6
시그널
Linux가 프로세스 제어와 이벤트 알림을 위해 시그널을 생성하고 차단하고 전달하고 처리하는 방법을 배웁니다.
시그널이 오는 곳
시그널은 여러 곳에서 시작될 수 있습니다.
- 터미널이
Ctrl-C에SIGINT,Ctrl-Z에SIGTSTP를 생성하여 포그라운드 프로세스 그룹에 보낼 수 있습니다. - 스레드가 잘못된 메모리 참조를 만들면 커널이
SIGSEGV같은 동기 시그널을 생성할 수 있습니다. - 프로세스가 권한을 가진 다른 프로세스나 프로세스 그룹에 시그널을 보낼 수 있습니다.
- 타이머, 자식 상태 변경, 터미널 hangup이 다른 시그널을 생성할 수 있습니다.
송신자는 일반적으로 자격 증명이나 capabilities를 기준으로 한 적절한 권한이 있어야 합니다. 따라서 시그널은 임의 사용자 사이의 제한 없는 메시지가 아니라 커널이 중개하는 제어 인터페이스입니다.
터미널은 일반적으로 Ctrl-C에 어떤 시그널을 생성하나요?
처리 방식과 기본 동작
대부분의 시그널에는 다음 세 응답 중 하나를 선택하는 프로세스 전체 처리 방식이 있습니다.
- 시그널에 정의된 기본 동작 수행
- 시그널 무시
- 사용자가 설치한 핸들러 호출
기본 동작은 서로 다릅니다. 시그널은 종료, 코어 덤프를 만들며 종료, 정지, 계속 또는 무시될 수 있습니다. SIGTERM을 잡으면 프로그램이 질서 있는 종료를 시작할 수 있지만 핸들러는 엄격한 비동기 시그널 안전 규칙을 따라야 하며 프로그램은 여전히 종료를 늦추거나 거부할 수 있습니다.
시그널 이름은 숫자보다 이식 가능하고 읽기 쉽습니다. 일반적인 Linux 아키텍처가 SIGTERM에 15를 사용하지만 관련 표준이 보장하지 않는 모든 시그널 번호가 어디서나 같다고 가정하지 마세요. kill -l로 로컬 매핑을 확인합니다.
프로세스가 SIGTERM에 정상적인 방식으로 응답할 수 있는 이유는 무엇인가요?
차단된 시그널과 대기 중 시그널
스레드에는 선택한 시그널 전달을 일시적으로 막을 수 있는 시그널 마스크가 있습니다. 생성된 차단 시그널은 표준 및 실시간 시그널 규칙에 따라 전달할 수 있을 때까지 대기 상태로 남습니다. 같은 종류의 표준 시그널은 발생할 때마다 큐에 쌓이지 않고 하나로 합쳐질 수 있습니다.
멀티스레드 프로세스에서 프로세스 대상 시그널은 차단하지 않은 적합한 스레드에 전달될 수 있고 스레드 대상 시그널은 지정된 스레드로 갑니다. 올바른 시그널 설계에는 “프로세스가 차단했는지”만 확인하는 것보다 더 많은 고려가 필요합니다.
차단 가능한 시그널이 대상에서 차단된 상태로 생성되면 일반적으로 어떻게 되나요?
처리할 수 없는 시그널
SIGKILL은 프로세스를 종료하고 SIGSTOP은 정지시킵니다. 두 시그널 모두 잡거나 무시하거나 차단할 수 없습니다. 커널이 최종 제어를 유지하도록 보장하지만 SIGKILL에는 애플리케이션 수준 정리 기회가 없습니다.
SIGKILL조차 관찰자 입장에서 작업을 즉시 사라지게 하지 못할 수 있습니다. 작업이 중단할 수 없는 커널 작업을 기다릴 수 있고 종료 후에도 부모가 상태를 수거해야 합니다.
잡거나 무시하거나 차단할 수 없는 시그널 쌍은 무엇인가요?
레슨 완료
시그널 완료
이제 Linux 시그널 처리의 주요 단계와 제약을 설명할 수 있습니다.
터미널, 커널, 프로세스가 생성한 시그널을 식별할 수 있습니다.
기본 동작, 무시된 시그널, 핸들러를 구분할 수 있습니다.
차단을 대기 전달 및 스레드 마스크와 연결할 수 있습니다.
SIGKILL과SIGSTOP을 처리하거나 차단할 수 없음을 기억할 수 있습니다.