언제 프로그래밍 방식으로 SIGINT를 강제로 보내나요?

언제 프로그래밍 방식으로 SIGINT를 강제로 보내나요?

추천 방법을 알고 있어요종료포그라운드 프로세스는 SIGTERM프로세스 자체에 리소스를 정리/해제할 수 있는 기회를 제공하므로 신호를 통해 수행됩니다. 신호는 명령에 의해서만 생성/전송될 수 있으며, kill pkill killall여기까지 할 수 있었던 모든 명령에 의해 생성/전송될 수 있습니다. 게다가, 그것은기본이러한 명령에 대한 신호입니다.

이제 난 SIGINT신호를 알아방해하다프로세스. 그러므로 '비슷하다'는종료.

그러나 나는 다음 답변(발췌)을 읽었습니다.

SIGINT그리고 SIGQUIT목표는구체적으로~을 위한단말기로부터의 요구: 이러한 신호를 생성하기 위해 특정 입력 문자를 지정할 수 있습니다(터미널 제어 설정에 따라 다름). 기본 작업은 기본 작업 및 변경할 수 없는 작업과 SIGINT동일한 유형의 프로세스 종료입니다 .SIGTERMSIGKILL

여기까지는 답변에 따라 키 조합( + )으로 SIGINT트리거됩니다 .ctrlc그리고 이론적으로 SIGINT동일한 작업을 수행하려면 SIGTERM다음을 수행합니다.프로그램 자체에 리소스를 정리/해제할 수 있는 기회 제공.

솔직히 말해서 많은 튜토리얼을 읽은 후에도 이 정보를 명확하게 찾고 확인할 수 없습니다. 예를 들어 다음에서 유래합니다.

다양한 장소에서 이 신호를 사용하세요방해하다그리고종료자귀.

게다가 같은 대답에 따르면,@JonathanLefler~의논평(발췌)은 다음과 같습니다.

이것이 핵심이다: 프로그램이 실행되는 동안 단일 문자를 사용하여 터미널에서 생성될 수 있습니다 SIGINT. SIGQUIT다른 신호는 다른 프로그램에 의해 어떻게든 생성되어야 합니다(예: 명령을 통해 kill). SIGINT덜 폭력적인 SIGQUIT;코어 덤프

지금까지 가능한 결론 중 하나는 SIGINT키 조합이나 명령으로만 트리거할 수 있다는 것 입니다 SIGTERM.

게시 이유: 그렇다면이론적으로 SIGINT그리고SIGTERM

질문

  • 언제 SIGINT프로그래밍 방식으로 보내야 합니까?

에 나타나 있으므로 kill -l사용하시면 됩니다.

추가 질문

또 만약에이론적으로 SIGINT-와 동일한 효과가 있으며 SIGTERM둘 다 무시/차단/처리될 수 있습니다.

  • 왜 만들어졌나요 SIGINT?
  • ctrl+가 처음부터 할당되지 않은 이유는 무엇 c입니까 SIGTERM?

솔직히 그럴 SIGINT줄 알았는데아니요그대로 안전하다방해하다따라서 이 프로세스에서는 일부 데이터가 일관되지 않은/완전한 상태로 남게 됩니다.

답변1

이것기본 동작SIGINT( SIGTERM다른 많은 신호와 마찬가지로) 프로세스를 종료하는 데 사용됩니다. 이는 예를 들어 문서화되어 있습니다.리눅스 매뉴얼 페이지signal(7), "표준 신호" 아래의 표를 참조하세요. 그 중 일부는 아래에 인용되어 있습니다. 실제로도 마찬가지이다.

테이블의 일부:

       Signal      Standard   Action   Comment
────────────────────────────────────────────────────────────────────────
       SIGHUP       P1990      Term    Hangup detected on controlling terminal
                                       or death of controlling process
       SIGINT       P1990      Term    Interrupt from keyboard
       SIGKILL      P1990      Term    Kill signal
       SIGTERM      P1990      Term    Termination signal

자, 이것은기본 동작. 대부분의 신호에 대해 이를 수신하는 프로그램은 신호 처리 기능을 미리 설정하여 이를 포착하거나 완전히 무시할 수 있습니다. SIGINT일반적으로 사용자가 Ctrl-C를 눌러 a를 전송하고 SIGTERM수신 프로그램을 종료해야 하는 다른 프로그램에서 보내는 경우가 많다는 점을 알면 프로그램은 이를 다르게 처리하기로 결정할 수 있습니다.

대화형 프로그램은 즉시 종료하지 않고 모든 장기 실행 작업을 종료하기로 결정하여 SIGINT사용자가 종료하거나 다른 작업을 수행하도록 선택할 수 있습니다. 여전히 종료하는 동안 SIGTERM. 그러면 더 간단한 프로그램에는 SIGHUP모든 데이터를 저장하고 종료하는 동일한 핸들러(예를 들어 다른 핸들러도 있을 수 있음)가 있을 수 있습니다.

예를 들어, 데비안에서 시도한 대화형 Bash 셸은 SIGINT어떤 작업도 수행하지 않고 현재 명령줄을 지웁니다. ( SIGTERM약간 놀랍지만 이는 전체 프로세스 그룹에 신호를 보내는 것과 관련이 있을 수 있습니다.) 이는 터미널 연결이 사라지는 것을 의미 SIGHUP하므로 SIGHUP더 많은 명령을 읽어도 소용이 없습니다.)

대부분의 신호는 수신 프로세스가 (잠재적으로) 종료되기 전에 정리 작업을 수행할 수 있도록 허용합니다. 두 가지 비정상 신호는 다음 SIGKILLSIGSTOP같습니다.할 수 없다잡히거나 무시되지만 정리 작업을 수행하지 않고 무조건 즉시 프로세스를 파괴하거나 중지합니다. (커널은 여전히 ​​운영 체제 리소스에 대해 필요한 정리를 수행하지만 여기서 정리는 프로세스 메모리에 저장되지 않은 데이터에 관한 것입니다.)

물론 기본적으로 프로세스를 종료하는 다른 신호도 있습니다. 마찬가지로 SIGALRM시스템 호출에 의해 설정된 타이머에 의해 전송됩니다 alarm(). 기본 동작은 일부 상황에서 유용할 수 있지만 프로그램에 특정 주기적인 작업을 수행하도록 지시하는 것과 같은 일반적인 알람 시계로 더 유용합니다.

답변2

언제 프로그래밍 방식으로 SIGINT를 강제로 보내나요?

대답은: 결코 그렇지 않습니다. 신호 전송은 필수 사항이 아닙니다. 신호는 전송되는 것이 아니라 캡처되도록 되어 있습니다.

SIGINT는 왜 만들어졌나요? 처음부터 ctrl+c가 SIGTERM에 할당되지 않은 이유는 무엇입니까?

답은 신호 코드(SIGINT=2, SIGKILL=9, SIGTERM=15)에 있습니다. SIGINT는 먼저 생성되어 ^C에 할당됩니다. 그런 다음 ^C가 때때로 응용 프로그램에 의해 처리되어야 한다는 사실이 발견되어 kill도구에서 사용할 수 있도록 새로운 "특수" SIGKILL이 추가되었습니다. 그러다가 이 신호를 여러 응용프로그램에서 잡아내는데, 이 신호를 잡아내지 않기를 바라는 마음에서 SIGTERM이 발명되었는데...

요점은 다음과 같습니다. - 기본적으로 종료, 종료해야 함, 일반적으로 종료 man 7 signal등으로 설명된 모든 신호에 해당됩니다 terminate application. 그러나 응용 프로그램은 원하는 것이 무엇이든 원하는 모든 신호를 포착하고 처리할 수 있으므로 모든 것이 더 많은 신호가 됩니다. 규칙보다는 제안. 여기서 핵심 단어는 '전통'이다.

관련 정보