ksbszabo@wateng.UUCP (Kevin Szabo) (01/26/85)
It seems that there is a bit of a race condition when the signal catcher redefines what to do with the signal and sends the signal to itself. For the 4.2 version I changed the signal it sends to be the non-catchable SIGSTOP. Only four lines have been added but I'll send the whole routine so you can see the context. Sorry, you can't use this with PATCH since I editted the original (yes, dangerous). Kevin onctlz () { curxy (0, Tscrlen); ceol (0,Tscrlen); unsetdpy(); signal(SIGTSTP,SIG_DFL); #ifdef V4P2 kill(0,SIGSTOP); /*re-send ^z, This one can't be caught. ksbszabo */ #else kill(0,SIGTSTP); /*re-send ^z */ #endif signal(SIGTSTP,onctlz); /* wake up here ... */ setdpy(); blank(); showscreen(); if (!intype) telluser(""); else { curxy (0, Tscrlen); ceol (0,Tscrlen); } } -- Kevin Szabo watmath!wateng!ksbszabo (U of Waterloo VLSI Group, Waterloo Ont.)
guy@rlgvax.UUCP (Guy Harris) (02/16/85)
> It seems that there is a bit of a race condition when the (SIGTSTP) signal > catcher redefines what to do with the signal and sends the signal > to itself. For the 4.2 version I changed the signal it sends to > be the non-catchable SIGSTOP. This same bug occurs if you try to run the S5R2 curses/terminfo package on a 4.2BSD system; the solution that the old curses package used was just to reset the signal handler for SIGTSTP to SIG_DFL at the beginning of the handler (in effect, reimplementing the bad old pre-4.2 signal handling). Guy Harris {seismo,ihnp4,allegra}!rlgvax!guy