On Fri, Mar 29, 2024 at 02:50:39PM +0100, Jilles Tjoelker wrote: > On Fri, Mar 29, 2024 at 12:24:00PM +0100, Johannes Altmanninger wrote: > > [*]: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html > > [**]: https://lists.gnu.org/archive/html/bug-bash/2023-01/msg00050.html > > There is definitely a good reason for S_HARD_IGN: it implements the > following requirement of the trap builtin (XCU 2.14 Special Built-In > Utilities -> trap): > > ] Signals that were ignored on entry to a non-interactive shell cannot > ] be trapped or reset, although no error need be reported when > ] attempting to do so. The wording in [*] is extremely confusing. To me, "If job control is disabled (see the description of set -m) when the shell executes an asynchronous list, the commands in the list shall inherit from the shell a signal action of ignored (SIG_IGN) for the SIGINT and SIGQUIT signals." sounds like those signals are ignored on entry, so it sounds like "cannot be trapped or reset" applies. I guess we are dealing with two different sets of inherited signal handlers, the specific SIGINT/SIGQUIT for asynchronous subshells, and the others that were inherited normally. > ] An interactive shell may reset or catch signals ] ignored on entry. > > The change that should be made is that the automatic ignore of SIGINT > and SIGQUIT in background subshells should not use hard ignore. > Hard ignore still applies if the shell inherits ignored signals > from its parent. Oh, I had thought, ignoresig(SIGINT) and ignoresig(SIGQUIT) on background subshell entry were our only uses of S_HARD_IGN. So this means that this logic from setsignal() if (act.sa_handler == SIG_IGN) { if (mflag && (signo == SIGTSTP || signo == SIGTTIN || signo == SIGTTOU)) { tsig = S_IGN; /* don't hard ignore these */ } else tsig = S_HARD_IGN; } interprets all inherited-as-ignored signals as being hard-ignored, but that doesn't include SIGINT/SIGQUIT because they were inherited in a different way, via ignoresig() Will fix.