なんかビックリしたのでメモ。
qdeb$ uname -a Linux qdeb 2.6.29-1-686 #1 SMP Sat Apr 4 17:36:29 UTC 2009 i686 GNU/Linux qdeb$ cat test_sig.c #include <stdio.h> #include <signal.h> int main() { struct sigaction oact; int signum; for (signum = SIGHUP; signum <= SIGPWR; signum++) { if (!sigaction(signum, NULL, &oact)) { printf("signum=%02d: sa_sigaction=%p sa_flags=0x%08x\n", signum, oact.sa_sigaction, oact.sa_flags); } } return 0; } qdeb$ gcc -o test_sig test_sig.c qdeb$ ./test_sig signum=01: sa_sigaction=(nil) sa_flags=0x00000000 signum=02: sa_sigaction=(nil) sa_flags=0x00000000 signum=03: sa_sigaction=(nil) sa_flags=0x00000000 signum=04: sa_sigaction=(nil) sa_flags=0x00000000 signum=05: sa_sigaction=(nil) sa_flags=0x00000000 signum=06: sa_sigaction=(nil) sa_flags=0x00000000 signum=07: sa_sigaction=(nil) sa_flags=0x00000000 signum=08: sa_sigaction=(nil) sa_flags=0x00000000 signum=09: sa_sigaction=(nil) sa_flags=0x00000000 signum=10: sa_sigaction=(nil) sa_flags=0x00000000 signum=11: sa_sigaction=(nil) sa_flags=0x00000000 signum=12: sa_sigaction=(nil) sa_flags=0x00000000 signum=13: sa_sigaction=(nil) sa_flags=0x00000000 signum=14: sa_sigaction=(nil) sa_flags=0x00000000 signum=15: sa_sigaction=(nil) sa_flags=0x00000000 signum=16: sa_sigaction=(nil) sa_flags=0x00000000 signum=17: sa_sigaction=(nil) sa_flags=0x00000000 signum=18: sa_sigaction=(nil) sa_flags=0x00000000 signum=19: sa_sigaction=(nil) sa_flags=0x00000000 signum=20: sa_sigaction=(nil) sa_flags=0x00000000 signum=21: sa_sigaction=(nil) sa_flags=0x00000000 signum=22: sa_sigaction=(nil) sa_flags=0x00000000 signum=23: sa_sigaction=(nil) sa_flags=0x00000000 signum=24: sa_sigaction=(nil) sa_flags=0x00000000 signum=25: sa_sigaction=(nil) sa_flags=0x00000000 signum=26: sa_sigaction=(nil) sa_flags=0x00000000 signum=27: sa_sigaction=(nil) sa_flags=0x00000000 signum=28: sa_sigaction=(nil) sa_flags=0x00000000 signum=29: sa_sigaction=(nil) sa_flags=0x00000000 signum=30: sa_sigaction=(nil) sa_flags=0x00000000 qdeb$ ./test_sig& [1] 31781 qdeb$ signum=01: sa_sigaction=(nil) sa_flags=0x00000000 signum=02: sa_sigaction=(nil) sa_flags=0x00000000 signum=03: sa_sigaction=(nil) sa_flags=0x00000000 signum=04: sa_sigaction=(nil) sa_flags=0x00000000 signum=05: sa_sigaction=(nil) sa_flags=0x00000000 signum=06: sa_sigaction=(nil) sa_flags=0x00000000 signum=07: sa_sigaction=(nil) sa_flags=0x00000000 signum=08: sa_sigaction=(nil) sa_flags=0x00000000 signum=09: sa_sigaction=(nil) sa_flags=0x00000000 signum=10: sa_sigaction=(nil) sa_flags=0x00000000 signum=11: sa_sigaction=(nil) sa_flags=0x00000000 signum=12: sa_sigaction=(nil) sa_flags=0x00000000 signum=13: sa_sigaction=(nil) sa_flags=0x00000000 signum=14: sa_sigaction=(nil) sa_flags=0x00000000 signum=15: sa_sigaction=(nil) sa_flags=0x00000000 signum=16: sa_sigaction=(nil) sa_flags=0x00000000 signum=17: sa_sigaction=(nil) sa_flags=0x00000000 signum=18: sa_sigaction=(nil) sa_flags=0x00000000 signum=19: sa_sigaction=(nil) sa_flags=0x00000000 signum=20: sa_sigaction=(nil) sa_flags=0x00000000 signum=21: sa_sigaction=(nil) sa_flags=0x00000000 signum=22: sa_sigaction=(nil) sa_flags=0x00000000 signum=23: sa_sigaction=(nil) sa_flags=0x00000000 signum=24: sa_sigaction=(nil) sa_flags=0x00000000 signum=25: sa_sigaction=(nil) sa_flags=0x00000000 signum=26: sa_sigaction=(nil) sa_flags=0x00000000 signum=27: sa_sigaction=(nil) sa_flags=0x00000000 signum=28: sa_sigaction=(nil) sa_flags=0x00000000 signum=29: sa_sigaction=(nil) sa_flags=0x00000000 signum=30: sa_sigaction=(nil) sa_flags=0x00000000 [1] + done ./test_sig qdeb$ cat test_sig.sh #!/bin/sh ./test_sig & qdeb$ sh test_sig.sh signum=01: sa_sigaction=(nil) sa_flags=0x00000000 signum=02: sa_sigaction=0x1 sa_flags=0x00000000 signum=03: sa_sigaction=0x1 sa_flags=0x00000000 signum=04: sa_sigaction=(nil) sa_flags=0x00000000 signum=05: sa_sigaction=(nil) sa_flags=0x00000000 signum=06: sa_sigaction=(nil) sa_flags=0x00000000 signum=07: sa_sigaction=(nil) sa_flags=0x00000000 signum=08: sa_sigaction=(nil) sa_flags=0x00000000 signum=09: sa_sigaction=(nil) sa_flags=0x00000000 signum=10: sa_sigaction=(nil) sa_flags=0x00000000 signum=11: sa_sigaction=(nil) sa_flags=0x00000000 signum=12: sa_sigaction=(nil) sa_flags=0x00000000 signum=13: sa_sigaction=(nil) sa_flags=0x00000000 signum=14: sa_sigaction=(nil) sa_flags=0x00000000 signum=15: sa_sigaction=(nil) sa_flags=0x00000000 signum=16: sa_sigaction=(nil) sa_flags=0x00000000 signum=17: sa_sigaction=(nil) sa_flags=0x00000000 signum=18: sa_sigaction=(nil) sa_flags=0x00000000 signum=19: sa_sigaction=(nil) sa_flags=0x00000000 signum=20: sa_sigaction=(nil) sa_flags=0x00000000 signum=21: sa_sigaction=(nil) sa_flags=0x00000000 signum=22: sa_sigaction=(nil) sa_flags=0x00000000 signum=23: sa_sigaction=(nil) sa_flags=0x00000000 signum=24: sa_sigaction=(nil) sa_flags=0x00000000 signum=25: sa_sigaction=(nil) sa_flags=0x00000000 signum=26: sa_sigaction=(nil) sa_flags=0x00000000 signum=27: sa_sigaction=(nil) sa_flags=0x00000000 signum=28: sa_sigaction=(nil) sa_flags=0x00000000 signum=29: sa_sigaction=(nil) sa_flags=0x00000000 signum=30: sa_sigaction=(nil) sa_flags=0x00000000ということなので、シェルというものはSIGINTとSIGQUITをスクリプトからバックグラウンド実行した時だけSIG_IGNに設定するようです。 ちなみにこれはLinuxのbashに限らず、NetBSDのshでも同様だったので、UNIXのシェルはそのように振る舞うことが期待されているようです。
知らんかったけど、なんでダロ?
とか思ってたんだけど、同僚からPOSIXによると、、、
When a command is in an asynchronous list, the shell shall prevent SIGQUIT and SIGINT signals from the keyboard from interrupting the command.だそうです。