The immediate execution of traps I introduced in September 1998 (to

make /etc/rc interruptible in cases when programs hang with blocked
signals) isn't standard enough.

It is now switched off by default and a new switch -T enables it.

You should update /etc/rc to the version I'm about to commit in a few
minutes to keep it interruptible.
This commit is contained in:
Martin Cracauer 1999-04-01 13:27:36 +00:00
parent 29b873f38d
commit c1c72a3c2a
4 changed files with 23 additions and 7 deletions

View File

@ -39,7 +39,7 @@
static char sccsid[] = "@(#)eval.c 8.9 (Berkeley) 6/8/95";
#endif
static const char rcsid[] =
"$Id$";
"$Id: eval.c,v 1.15 1998/05/18 06:43:34 charnier Exp $";
#endif /* not lint */
#include <signal.h>
@ -706,7 +706,8 @@ evalcommand(cmd, flags, backcmd)
/* Fork off a child process if necessary. */
if (cmd->ncmd.backgnd
|| (cmdentry.cmdtype == CMDNORMAL && (flags & EV_EXIT) == 0)
|| (cmdentry.cmdtype == CMDNORMAL
&& ((flags & EV_EXIT) == 0 || Tflag))
|| ((flags & EV_BACKCMD) != 0
&& (cmdentry.cmdtype != CMDBUILTIN
|| cmdentry.u.index == DOTCMD

View File

@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* @(#)options.h 8.2 (Berkeley) 5/4/95
* $Id$
* $Id: options.h,v 1.7 1997/02/22 13:58:40 peter Exp $
*/
struct shparam {
@ -64,8 +64,9 @@ struct shparam {
#define bflag optlist[13].val
#define uflag optlist[14].val
#define privileged optlist[15].val
#define Tflag optlist[16].val
#define NOPTS 16
#define NOPTS 17
struct optent {
const char *name;
@ -91,6 +92,7 @@ struct optent optlist[NOPTS] = {
{ "notify", 'b', 0 },
{ "nounset", 'u', 0 },
{ "privileged", 'p', 0 },
{ "trapsasync", 'T', 0 },
};
#else
extern struct optent optlist[NOPTS];

View File

@ -33,7 +33,7 @@
.\" SUCH DAMAGE.
.\"
.\" from: @(#)sh.1 8.6 (Berkeley) 5/4/95
.\" $Id: sh.1,v 1.23 1998/12/18 03:51:18 jkoshy Exp $
.\" $Id: sh.1,v 1.24 1999/03/31 21:02:01 brian Exp $
.\"
.Dd May 5, 1995
.Dt SH 1
@ -202,12 +202,24 @@ after
and ignores the contents of the
.Ev ENV
variable.
.It Fl s Li stdin
Read commands from standard input (set automatically
if no file arguments are present). This option has
no effect when set after the shell has already started
running (i.e. with
.Xr set 1 Ns ).
.It Fl T Li asynctraps
When waiting for a child, execute traps immediately. If this option is
not set, traps are executed after the child exits, as specified in
.St -p1003.2
This nonstandard option is useful to put guarding shells around childs
that block signals. The surrounding shell may kill the child or it may
just return control to the tty and leave the child alone, like this:
.Bd -literal -offset indent
sh -T -c "trap 'exit 1' 2 ; some-blocking-program"
.Ed
.Pp
.It Fl u Li nounset
Write a message to standard error when attempting
to expand a variable that is not set, and if the

View File

@ -39,7 +39,7 @@
static char sccsid[] = "@(#)trap.c 8.5 (Berkeley) 6/5/95";
#endif
static const char rcsid[] =
"$Id: trap.c,v 1.16 1998/09/10 14:51:06 cracauer Exp $";
"$Id: trap.c,v 1.17 1998/09/10 22:09:11 cracauer Exp $";
#endif /* not lint */
#include <signal.h>
@ -367,7 +367,8 @@ onsig(signo)
* If a trap is set, not ignored and not the null command, we need
* to make sure traps are executed even when a child blocks signals.
*/
if (trap[signo] != NULL &&
if (Tflag &&
trap[signo] != NULL &&
! trap[signo][0] == '\0' &&
! (trap[signo][0] == ':' && trap[signo][1] == '\0'))
breakwaitcmd = 1;