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.
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.

I know POSIX does not say anything about it, but neither does the man
page. The result of this is confusing behaviour. It should either hard
ignore _all_ signals or none. I really don't see any reason for a hard
ignore for special signals via GETORIGSIG when we already have the
stuff in place in initialize_terminating_signals() that does the right
thing.

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:

#if defined (__BEOS__)
  /* BeOS sets SIGINT to SIG_IGN! */
  original_signals[SIGINT] = SIG_DFL;
  sigmodes[SIGINT] &= ~SIG_HARD_IGNORE;
#endif


-- 
Siddhesh Poyarekar
http://siddhesh.in


Reply via email to