Call tree
- pthread_kill(3)などはtgkill(2)を用いて実装されている
シグナル生成&配送
SYSCALL_DEFINE(tgkill)
- do_tkill
- do_send_specific
- do_send_sig_info
- send_signal // send signal
- __send_signal // send signal implementation
- legacy_queue // See whether the target signal is pending or not.
// if it has already been pending, return 0 immediately.
- __sigqueue_alloc // allocate a new signal record
- complete_signal // delivering sinal...
- signal_wake_up
シグナル処理
ret_to_user // return to user
- do_notify_resume // singals are pendign?
- do_signal // handle signal
- handle_signal
do_send_specific converts -ESRCH to 0. POSIX仕様的にも、ESRCHは使わなくなったよう
指定したシグナルがリアルタイムシグナルでないか、また既にpending状態であるかを特定する。リアルタイムシグナルまたは、既に指定のシグナルがpending状態であるならば即座に0を返す。
新しいシグナルキューの領域を取得する。実体はスラブアロケータ。シグナルの制限もみている。
TIF_SIGPENDINGをセットする。シグナル受け取り側はTIF_SIGPENDINGがセットされているかどうかでシグナルハンドリングを行うかを決定している。 この後、配送先のwake upを行う
Signals are handled when return to user from interrupts.
ret_to_user
- do_notify_resume
- do_signal
- handle_signal
el0_svcの最後に呼ばれる。
TIF_SIGPENDINGが立っていればdo_signalを呼ぶ
シグナル処理