なんかビックリしたのでメモ。
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.だそうです。