Process pending signals while waiting for a job:

$ cat << EOF > hup.sh
    #!/bin/sh
    trap 'echo SIGHUP; exit 1' 1
    sleep 10000 &
    wait
    EOF
    $ chmod +x ./hup.sh
    $ ./hup.sh &
    $ kill -HUP %1
This commit is contained in:
christos 2015-08-22 09:55:23 +00:00
parent 1e8c46e3c4
commit c0195771da
3 changed files with 9 additions and 10 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: jobs.c,v 1.73 2014/04/11 01:49:45 christos Exp $ */
/* $NetBSD: jobs.c,v 1.74 2015/08/22 09:55:23 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)jobs.c 8.5 (Berkeley) 5/4/95";
#else
__RCSID("$NetBSD: jobs.c,v 1.73 2014/04/11 01:49:45 christos Exp $");
__RCSID("$NetBSD: jobs.c,v 1.74 2015/08/22 09:55:23 christos Exp $");
#endif
#endif /* not lint */
@ -1058,13 +1058,12 @@ dowait(int flags, struct job *job)
struct job *thisjob;
int done;
int stopped;
extern volatile char gotsig[];
TRACE(("dowait(%x) called\n", flags));
do {
pid = waitproc(flags & WBLOCK, job, &status);
TRACE(("wait returns pid %d, status %d\n", pid, status));
} while (pid == -1 && errno == EINTR && gotsig[SIGINT - 1] == 0);
} while (pid == -1 && errno == EINTR && pendingsigs == 0);
if (pid <= 0)
return pid;
INTOFF;

View File

@ -1,4 +1,4 @@
/* $NetBSD: trap.c,v 1.35 2011/06/18 21:18:46 christos Exp $ */
/* $NetBSD: trap.c,v 1.36 2015/08/22 09:55:23 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)trap.c 8.5 (Berkeley) 6/5/95";
#else
__RCSID("$NetBSD: trap.c,v 1.35 2011/06/18 21:18:46 christos Exp $");
__RCSID("$NetBSD: trap.c,v 1.36 2015/08/22 09:55:23 christos Exp $");
#endif
#endif /* not lint */
@ -77,8 +77,8 @@ __RCSID("$NetBSD: trap.c,v 1.35 2011/06/18 21:18:46 christos Exp $");
char *trap[NSIG+1]; /* trap handler commands */
MKINIT char sigmode[NSIG]; /* current value of signal */
volatile char gotsig[NSIG]; /* indicates specified signal received */
int pendingsigs; /* indicates some signal received */
static volatile char gotsig[NSIG];/* indicates specified signal received */
volatile int pendingsigs; /* indicates some signal received */
static int getsigaction(int, sig_t *);

View File

@ -1,4 +1,4 @@
/* $NetBSD: trap.h,v 1.20 2012/03/15 02:02:20 joerg Exp $ */
/* $NetBSD: trap.h,v 1.21 2015/08/22 09:55:23 christos Exp $ */
/*-
* Copyright (c) 1991, 1993
@ -34,7 +34,7 @@
* @(#)trap.h 8.3 (Berkeley) 6/5/95
*/
extern int pendingsigs;
extern volatile int pendingsigs;
void clear_traps(int);
sig_t setsignal(int, int);