시그널에 응답할 수 있다고 하는데, 어떻게 가능한지 모르겠습니다. 시그널 핸들러는 응용의 컨텍스트에서 실행되는 코드가 아닌가요? 커널 문맥으로 실행된다면 응용의 코드가 그 문맥에서 실행된다고 말할 수 있는 것은 아닌지...
리눅스 커널에 대해서 조금씩 조금씩 배워가고 있는데 아직까지의 얕은 지식으로는 이해가 되지 않는 부분들이 많아서 이렇게 질문을 드립니다.
그럼 항상 건강하세요.
프로세스에게 시그널이 전달되고 이 프로세스가 해당 시그널을 block 하고 있지 않다면 signal_wake_up() 함수가 실행됩니다.
다음은 <kernel/signal.c> 의 specific_send_sig_info() 함수 중 일부입니다.
868 ret = send_signal(sig, info, t, &t->pending);
869 if (!ret && !sigismember(&t->blocked, sig))
870 signal_wake_up(t, sig == SIGKILL);
signal_wake_up() 함수는 해당 프로세스가 TASK_INTERRUPTIBLE 상태라면
(두번째 인자에 따라서 다른 상태일때도) 깨우게 됩니다.
583 void signal_wake_up(struct task_struct *t, int resume)
584 {
585 unsigned int mask;
586
587 set_tsk_thread_flag(t, TIF_SIGPENDING);
588
589 /*
590 * For SIGKILL, we want to wake it up in the stopped/traced case.
591 * We don't check t->state here because there is a race with it
592 * executing another processor and just now entering stopped state.
593 * By using wake_up_state, we ensure the process will wake up and
594 * handle its death signal.
595 */
596 mask = TASK_INTERRUPTIBLE;
597 if (resume)
598 mask |= TASK_STOPPED | TASK_TRACED;
599 if (!wake_up_state(t, mask))
600 kick_process(t);
601 }
signal_wake_up()
프로세스에게 시그널이 전달되고 이 프로세스가 해당 시그널을 block 하고 있지 않다면 signal_wake_up() 함수가 실행됩니다.
다음은 <kernel/signal.c> 의 specific_send_sig_info() 함수 중 일부입니다.
signal_wake_up() 함수는 해당 프로세스가 TASK_INTERRUPTIBLE 상태라면
(두번째 인자에 따라서 다른 상태일때도) 깨우게 됩니다.
댓글 달기