Linux에서 여러 가지로 신호 처리
Linux에서 프로그램 (다중 일 가능성이 있음)이 SIGTERM 또는 SIGHUP과 같은 신호를 수신하면 어떻게합니까?
어느 쪽이 신호를 차단합니까? 여러 개의 동일한 신호를 가지고 있습니까? 신호 처리를 전담하는 특수 기재가? 내부에없는 경우 신호를 처리하는 내부에서 어떤 일이 발생합니까? 신호 루틴이 실행 후 실행이 어떻게 재개 검사합니까?
사용중인 Linux 버전에 따라 약간의 차이가 있습니다.
2.6 posix를 가정하고 SIGTERM 또는 SIGHUP을 전송하는 OS에 대해 이야기하는 경우 신호는 프로세스로 전송 루트가 수신하고 처리합니다. POSIX는 어떤 일이 발생하는지 여부를 SIGTERM을 사용하여 SIGTERM을 사용합니다.
2.6 SIGTERM은 단어가 "깨끗하게"단어가 "깨끗하게", 2.4 인 단어는 불확실한 상태로 남아 있습니다.
pthreads(7)
POSIX.1에는 다음을 포함하여 프로세스 공유 속성의 모든 것이 필요합니다.
- 신호 처리
POSIX.1은 또한 다음을 포함하여 각 문자마다 고유 해야 할 몇 가지 속성을 요구합니다 .
신호 마스크 ( )
pthread_sigmask(3)
대체 신호 스택 ( )
sigaltstack(2)
리눅스에서 루틴 에는 다음과 같은 코드 블록이 있습니다. 주석은 매우 유용합니다.complete_signal
/*
* Now find a thread we can wake up to take the signal off the queue.
*
* If the main thread wants the signal, it gets first crack.
* Probably the least surprising to the average bear.
*/
if (wants_signal(sig, p))
t = p;
else if (!group || thread_group_empty(p))
/*
* There is just one thread and it does not need to be woken.
* It will dequeue unblocked signals before it runs again.
*/
return;
else {
/*
* Otherwise try to find a suitable thread.
*/
t = signal->curr_target;
while (!wants_signal(sig, t)) {
t = next_thread(t);
if (t == signal->curr_target)
/*
* No thread needs to be woken.
* Any eligible threads will see
* the signal in the queue soon.
*/
return;
}
signal->curr_target = t;
}
/*
* Found a killable thread. If the signal will be fatal,
* then start taking the whole group down immediately.
*/
if (sig_fatal(p, sig) &&
!(signal->flags & SIGNAL_GROUP_EXIT) &&
!sigismember(&t->real_blocked, sig) &&
(sig == SIGKILL || !p->ptrace)) {
/*
* This signal will be fatal to the whole group.
*/
따라서 신호가 전달되는 위치를 담당 하고 있음을 알 수 있습니다 .
프로세스가 신호 처리 SIG_IGN
또는로 설정하는 경우 SIG_DFL
모든 경우에 대해 신호가 무시됩니다 (또는 무시됩니다).
프로세스가 신호 처리를 사용하는 루틴으로 설정 한 경우를 사용하여 수신 신호 마스크를 조작하여 신호를 수신 할 경우를 제어 할 수 있습니다 . 하나의 기본을 지정하여 기본을 모두 사용하거나 특정 신호에 대해 하나의 같은 사용 또는 특정 신호에 대해 기본 옵션을 혼합하여 만들거나 Linux의 현재 동작을 기본적으로 신호를 사용할 수 있습니다.pthread_sigmask(3)
그러나 signal(7)
man 페이지 에 따르면 일부 신호는 특별 합니다.
프로세스 전체 (예 : kill (2)를 사용하여 전송 된 경우 ) 또는 특정 스레드 (예 : SIGSEGV 및 SIGFPE와 같은 특정 신호 )에 대해 신호가 생성 (따라서 보류 중) 될 수 있습니다. 특정 기계어 명령어는 pthread_kill (3)을 사용하여 특정 스레드를 대상으로하는 신호와 마찬가지로 스레드 지시입니다 . 프로세스 지시 신호는 현재 신호가 차단되지 않은 스레드 중 하나로 전달 될 수 있습니다. 둘 이상의 스레드에서 신호가 차단 해제 된 경우 커널은 신호를 전달할 임의의 스레드를 선택합니다.
참고 URL : https://stackoverflow.com/questions/11679568/signal-handling-with-multiple-threads-in-linux
'IT' 카테고리의 다른 글
Entity Framework Code First는 저장 프로 시저를 지원합니까? (0) | 2020.07.27 |
---|---|
정적 인덱서? (0) | 2020.07.27 |
프로토콜이 자체 준수하지 않습니까? (0) | 2020.07.27 |
C ++, 프리 스토어 및 힙 (0) | 2020.07.27 |
cmd.exe에서 stderr을 null로 리디렉션하는 방법 (0) | 2020.07.27 |