非対話的な bash からバックグラウンドで動かしたプロセスは SIGINT, SIGQUIT が無視される、とマニュアルにある。
Non-builtin commands run by bash have signal handlers set to the values inherited by the shell from its parent. When job control is not in effect, asynchronous commands ignore SIGINT and SIGQUIT in addition to these inherited handlers.
試してみると、たしかに SigIgn が 0 でない。
% bash -c 'cat /proc/self/status|egrep SigIgn & wait' SigIgn: 0000000000000006 % bash --version GNU bash, version 3.2.39(1)-release (i486-pc-linux-gnu) Copyright (C) 2007 Free Software Foundation, Inc.
SIGINT, SIGQUIT はそれぞれ 2, 3 なので、ビットシフトしてビット論理和をとれば 6 というのがそうなのだろう。
% egrep 'SIGINT|SIGQUIT' /usr/include/bits/signum.h #define SIGINT 2 /* Interrupt (ANSI). */ #define SIGQUIT 3 /* Quit (POSIX). */
zsh も同様である。
% zsh -c 'cat /proc/self/status|egrep SigIgn & wait' SigIgn: 0000000000000006 % zsh --version zsh 4.3.6 (i686-pc-linux-gnu)
だが、pdksh はそうでない。
% ksh -c 'cat /proc/self/status|egrep SigIgn & wait' SigIgn: 0000000000000000 % ksh -c 'echo $KSH_VERSION' @(#)PD KSH v5.2.14 99/07/13.2
[latest]