2009-04-22 [長年日記]

_ [unix]/bin/shさんのシグナル設定について

なんかビックリしたのでメモ。

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. 
だそうです。

[]