天泣記

2011-06-06 (Mon)

#1

非対話的な 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]


田中哲