■
アクセスベクタprocess:siginhについて。
「シグナルハンドラの継承」を許可したりするものだが,
そもそも「シグナルハンドラの継承」はどうなってたっけ?
と検証。
一見すべての場合継承されるように思えたが…
●結論:exec時には,シグナルハンドラは継承されない。つまり,process:siginhは,exec時にチェックされても意味がない。
exec時に呼ばれる関数 511 static int load_elf_binary(struct linux_binprm * bprm, struct pt_regs * regs) … 744 /* Flush all traces of the currently running executable */ 745 retval = flush_old_exec(bprm);
flush_old_execってのが呼ばれる。
fs/exec.c 841 int flush_old_exec(struct linux_binprm * bprm) … 913 flush_signal_handlers(current, 0); ここで,flush_signal_handlersというのが呼ばれ, kernel/signal.c 431 flush_signal_handlers(struct task_struct *t, int force_default) 432 { 433 int i; 434 struct k_sigaction *ka = &t->sighand->action[0]; 435 for (i = _NSIG ; i != 0 ; i--) { 436 if (force_default || ka->sa.sa_handler != SIG_IGN) 437 ka->sa.sa_handler = SIG_DFL; 438 ka->sa.sa_flags = 0; 439 sigemptyset(&ka->sa.sa_mask); 440 ka++; 441 } 442 }
if (force_default || ka->sa.sa_handler != SIG_IGN)
という条件は,ka->sa.sa_handler != SIG_IGN は成立する。シグナルを無視しない場合という意味。
シグナルを無視しない場合は,デフォルトのシグナルハンドラがセットされる。