우리는 또한 프로그램이 IPC 신호를 가로채고 내부 핸들러를 실행하여 기본 핸들러의 작업을 우회할 수도 있다는 것을 알고 SIGKILL
있습니다 SIGSTOP
.
나는 신호를 사용하여 이 작업을 수행해야 하는 적어도 하나의 좋은 이유를 생각할 수 있습니다 SIGINT
.
- 즉, 프로세스를 종료하는 기본 신호 작업으로 돌아가기 전에 마지막 백업을 수행하거나, 메모리 덤프를 저장하거나, 로그에 기록하는 신호 처리기를 구현합니다.
또한 악성 코드가 SIGINT를 포착하고 차단하는 한 가지 타당한 이유를 생각해 볼 수 있습니다.
즉, 프로세스의 실행 시간을 연장합니다. 대부분의 사용자에게 Ctrl+는 대부분의 최종 사용자를 위한 키보드 단축키입니다. 코어를 보내고 생성하는 + 는 물론 + ( 프로세스를 중지하고 터미널에 남아 있음 ) C에 대해 모르는 사람들이 많이 있습니다 . 매장을 이전합니다.CtrlZ
SIGTSTP
jobs
Ctrl\SIGQUIT
Ctrl+가 포착되어 차단된 경우 C해당 사용자는 다른 터미널 창을 열고 다음을 실행하려고 시도할 수 있습니다.
ps aux | grep [process name]
프로세스 PID를 얻고 SIGKILL을 실행하십시오.
kill -9 [$PID]
마찬가지로, 원격 시스템의 터미널 세션에 연결된 사용자는 새로운 터미널 세션에 대한 두 번째 연결 설정을 시도하고 유사한 프로세스/PID 검색을 통해 범인을 종료합니다. 분명히 이 전략은 짧은 시간 동안만 프로세스 런타임을 연장할 수 있지만 10MB/s 고대역폭 연결을 사용하여 파일을 3분 더 전송하더라도 거의 2GB의 추가 데이터가 전송되므로 확실히 이점이 있습니다. 그것. .
그러나 최근에 나는 일부 프로그램이 다른 하위 집합에 속하는 것처럼 보인다는 사실을 발견했습니다. 아마도 내가 그것에 관심을 갖기 시작했기 때문일 수도 있습니다.
이러한 프로그램은 오픈 소스이며 패키지는 충분히 유지 관리 및 검사되어 주요 악성 코드가 숨겨질 가능성이 거의 없습니다.
vim
다른 텍스트 편집기처럼 키보드 입력을 제어하지 않습니다.SIGINT를 포착하고 완전히 무시하는 내부 처리기가 있습니다. 최종 프로세스 종료는 없으며, 우리가 아는 한 최종적으로 중요한 작업은 시도되지 않습니다.
내 질문:
프로세스가 합법적인 목적을 위해 SIGINT를 가로채지만 완전히 폐기하도록 선택할 수 있는 가능한 이유가 있습니까?
즉, SIGINT를 포착하고 무시하는 것이 알려진 기본 작업(실행 중인 프로세스 종료)보다 더 유리한 타당한 이유(코드 또는 시스템 관점에서)나 상황이 있습니까?
답변1
발견한 바와 같이 프로그램이 SIGINT를 무시하는 가장 가능성 있는 이유는 오류입니다. 제대로 작동하는 프로그램은 신호를 존중해야 하며,대개SIGINT는 "종료하세요"를 의미하지만 필수 동작은 아닙니다. 프로그램은 자체 목적으로 SIGINT를 사용할 수 있는 모든 권리를 갖습니다. 마찬가지로, 많은 프로그램(보통 데몬)은 SIGHUP을 사용하여 "제어 터미널이 중단되었습니다"가 아니라 "구성 파일을 다시 로드하는 중"을 의미합니다.
- 장기 실행 프로그램이나 데몬은 SIGINT를 사용하여 "인터럽트"를 나타낼 수 있습니다.현재의내가 하고 있는 일을 확인하고 다음 작업으로 넘어가세요.”
- 이벤트를 기다리는 프로그램은 SIGINT를 사용하여 "[이벤트]에 대한 대기를 중지하고 계속함"을 의미할 수 있습니다(SIGTERM은 "[이벤트]에 대한 대기를 중지하고 종료"를 의미할 수도 있음).
- 신호는 종종 여러 프로세스로 전송됩니다. 프로그램은 의도된 수신자가 아니라고 믿을 만한 이유가 있는 경우 이를 무시할 수 있습니다.
- 프로그램은 자신이 사용자보다 더 잘 알고 있다고 (정확하게 또는 부정확하게) 믿고 수행 중인 작업을 계속하기 위해 인터럽트 및 기타 선택적 신호를 무시할 수 있습니다. 예를 들어 디스크 복구 프로세스와 같은 중요한 작업은 중지 요청 중간에 사용자를 합법적으로 무시할 수 있습니다. .
물론 프로그램에 관계없이~해야 한다이러한 이유로 인해 SIGINT를 다르게 처리하는 것은 논란의 여지가 있습니다. 이는 프로그램이 빨리 종료되기를 기대하는 사용자를 놀라게 하거나 혼란스럽게 할 수 있습니다. 따라서 SIGINT를 특이한 방식으로 처리하는 것을 고려하여 올바르게 동작하는 프로그램은 이 동작이 (대부분의) 사용자에게 의미가 있음을 보장해야 합니다.
이 기사(링크에서위키피디아), SIGINT 및 적절한 처리에 대해 자세히 설명하고 SIGINT 처리를 구현할 때 고려해야 할 몇 가지 극단적인 경우에 대해 논의합니다.