On 3/26/10 1:50 AM, Siddhesh Poyarekar wrote: > On Fri, Mar 26, 2010 at 2:40 AM, Eric Blake <ebl...@redhat.com> wrote: >> Yes. POSIX requires this for non-interactive shells, and does not >> forbid it for interactive shells. Technically, this code could be >> modified to exempt interactive shells from hard-ignores, or left as is >> by treating both classes of shells identically in keeping things >> hard-ignored; either approach still meets POSIX. >> > > The code does explicitly hard ignore signals ignored when entering a > non-interactive shell; see initialize_terminating_signals() in sig.c.
This isn't exactly true, but it doesn't really matter. > The problem is that in addition to this, it ends up doing a hard > ignore for the special signals in GETORIGSIG() -- not for all > terminating signals, just the special signals. This is true only for interactive shells. It might be a useful addition, and improve consistency, to set the original signal for terminating signals when initialize_terminating_signals finds an ignored signal. (It might be better to leave it ignored. I'll think about it.) Another approach is to only set the hard-ignore flag in non-interactive shells. Either way, you're right: the shell has to do something with signals it catches, because the true inherited value has to be saved somewhere. Other signals are already handled by the trap builtin, which does the right thing. I think this isn't a big problem. Bash is allowed to completely disregard signals that are ignored when it is invoked. It doesn't matter what it does internally, as long as it obeys the Posix rules: don't allow the disposition to be manipulated with trap when the shell is not interactive, and make sure that child processes have the signal handlers set correctly. This discussion did allow me to find and fix one bug: interactive shells did not reset the handlers for terminating signals correctly when running commands from the file system. That fix will be in the next bash release. > What's more, BeOS gets special treatment in all this; its hard ignore > flag is removed after GETORIGSIG() for SIGINT because BeOS sets SIGINT > to SIG_IGN by default: Yes. Both BeOS systems still running need it. Chet -- ``The lyf so short, the craft so long to lerne.'' - Chaucer ``Ars longa, vita brevis'' - Hippocrates Chet Ramey, ITS, CWRU c...@case.edu http://cnswww.cns.cwru.edu/~chet/