TASK_INTERRUPTIBLE 상태로 태스크가 휴면하게 되면
글쓴이: dalant019 / 작성시간: 수, 2006/02/08 - 5:22오전
시그널에 응답할 수 있다고 하는데, 어떻게 가능한지 모르겠습니다. 시그널 핸들러는 응용의 컨텍스트에서 실행되는 코드가 아닌가요? 커널 문맥으로 실행된다면 응용의 코드가 그 문맥에서 실행된다고 말할 수 있는 것은 아닌지...
리눅스 커널에 대해서 조금씩 조금씩 배워가고 있는데 아직까지의 얕은 지식으로는 이해가 되지 않는 부분들이 많아서 이렇게 질문을 드립니다.
그럼 항상 건강하세요.
Forums:


signal_wake_up()
프로세스에게 시그널이 전달되고 이 프로세스가 해당 시그널을 block 하고 있지 않다면 signal_wake_up() 함수가 실행됩니다.
다음은 <kernel/signal.c> 의 specific_send_sig_info() 함수 중 일부입니다.
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 }