programing

Linux에서 여러 스레드를 사용한 신호 처리

luckcodes 2022. 8. 8. 22:12

Linux에서 여러 스레드를 사용한 신호 처리

Linux 에서는 SIGTERM 또는 SAHUP 등의 프로그램이 신호를 수신하면 어떻게 됩니까?

어떤 스레드가 신호를 가로채나요?여러 스레드가 동일한 신호를 수신할 수 있습니까?신호 처리 전용 특수 스레드가 있습니까?그렇지 않으면 신호를 처리하는 스레드 내부에서 어떤 일이 발생합니까?신호 핸들러 루틴이 종료된 후 어떻게 실행이 재개됩니까?

pthreads(7) 에, POSIX.1에서 프로세스 공유 속성의 모든 스레드가 필요한 것을 나타냅니다.여기에는 다음이 포함됩니다.

  • 신호 배치

또, POSIX.1 에서는, 다음과 같은 몇개의 어트리뷰트가 각 스레드에 대해서 구별되어야 합니다.

Linux 커널 루틴에는 다음과 같은 코드 블록이 있습니다. 코멘트는 매우 유용합니다.

/*
 * 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모든 스레드에 대해 신호가 무시됩니다(또는 기본값(kill, core 또는 ignore).

프로세스가 특정 핸들러 루틴으로 신호의 배치를 설정한 경우 를 사용하여 특정 스레드 신호 마스크를 조작하여 신호를 수신하는 스레드를 제어할 수 있습니다.스레드 하나를 지정하여 모든 스레드를 관리하거나 신호마다 스레드를 하나씩 만들거나 특정 신호에 대해 이러한 옵션을 혼합하거나 Linux 커널의 현재 기본 동작인 메인 스레드에 신호를 전달할 수 있습니다.

단, man 페이지에 따라서는 특별한 신호도 있습니다.

프로세스 전체(예를 들어 kill(2)사용하여 송신되는 경우) 또는 특정 스레드(예를 들어 특정 기계어 명령을 실행한 결과로 생성되는 SIGSEGV 및 SIGFPE 등의 특정 신호는 p_third(읽기)를 사용하여 특정 스레드를 대상으로 하는 신호로서 스레드이다)에 대해 신호를 생성할 수 있다.프로세스 지향 신호는 현재 신호가 차단되지 않은 스레드 중 하나에 전달될 수 있습니다.둘 이상의 스레드에 신호가 차단되지 않은 경우 커널은 신호를 전달할 임의의 스레드를 선택합니다.

이것은 사용하고 있는 Linux 커널의 버전에 따라 약간 차이가 있습니다.

2.6 posix 스레드라고 가정하고, OS가 SIGTERM 또는 SAHUP을 송신하고 있는 경우, 신호는 프로세스로 송신되어 루트 스레드에 의해 수신 및 처리됩니다.POSIX 스레드를 사용하면 개별 스레드에도 SIGTERM을 송신할 수 있습니다만, OS가 프로세스에 신호를 송신하면 어떻게 되는지 묻고 있는 것이 아닐까 생각합니다.

2.6에서는 SIGTERM에 의해 하위 스레드가 "깨끗하게" 종료됩니다.여기서 2.4에서는 하위 스레드가 불확실한 상태로 남아 있습니다.

언급URL : https://stackoverflow.com/questions/11679568/signal-handling-with-multiple-threads-in-linux