[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Incorrect signal handling under SYSV machines



Hi,
> I have used es-0.9-alpha1 for many moon under SunOS 4.1.[34] and DEC
> Alpha UNIX V4.0. [Note: I always have `interrupt' set to Control C
> under the terminal driver.] Whenever I hit Control C, most normal
> programs interactively activated under the shell are killed and I get
> a fresh command prompt. If I was in the middle of forming a command
> line, it is killed and I get a fresh prompt. Even if I had typed
> nothing, I get a fresh prompt. [...]
> 
> Under HP-UX 10.20, when I hit Control C twice at any points during a
> session under the es shell, the shell ``terminate[s] on signal 2.''
Hmm, yes...
I came across this a while ago, and I think the following fixed it for
me, pending further investigation (which is still pending 8^/ ):
*** signal.c.orig	Tue May 30 12:13:51 1995
--- signal.c	Fri Jul 7 10:36:44 1995
***************
*** 65,70 ****
--- 65,71 ----
 /*
 * the signal handler
 */
+ static Sighandler setsignal(int sig, Sighandler handler);
 
 /* catcher -- catch (and defer) a signal from the kernel */
 static void catcher(int sig) {
***************
*** 79,86 ****
 		++sigcount;
 	}
 	interrupted = TRUE;
! 	if (slow)
 		longjmp(slowlabel, 1);
 }
 
 
--- 80,91 ----
 		++sigcount;
 	}
 	interrupted = TRUE;
! 	if (slow) {
! #if USE_SIGACTION
! 		setsignal(sig, catcher);
! #endif
 		longjmp(slowlabel, 1);
+ 	}
 }
 
 
It looks like HP-UX is rather more strict, or something, about the
circumstances under which it restores the original signal mask in
a signal handler, using sigaction.
The HP-UX sigaction(2) manual entry says:
 When a signal is caught by a signal-catching function installed
 by sigaction, a new mask is calculated and installed for the
 duration of the signal-catching function, or until a call is
 made to sigprocmask() or sigsuspend() (see sigprocmask(2) and
 sigsuspend(2)). [...] If and when the signal-catching function
 returns normally, the original signal mask is restored.
The key is in that last sentence. When you press the INTR key during
command entry, the `slow' flag is true, and the code takes the longjmp
out of the signal handler. The longjmp doesn't count as `returning
normally' from the signal handler, so the signal mask isn't restored.
Hope this helps,
Chris
-- 
Chris R Dalton (crd@hplb.hpl.hp.com)
Hewlett-Packard Laboratories, Stoke Gifford, Bristol, UK BS12 6QZ
Phone: +44 117 922 8744 or +44 117 979 9910 x28744 FAX: +44 117 922 8924

AltStyle によって変換されたページ (->オリジナル) /