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:
parent
1e8c46e3c4
commit
c0195771da
@ -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;
|
||||
|
@ -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 *);
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user