mangler@cit-vax.Caltech.Edu (Don Speck) (12/27/87)
I have a signal-catch routine where it would be handy to tell the outside world that it's ready for another signal just before doing a longjmp out of the signal routine, instead of doing it in the mainline code after the longjmp has occurred. Of course, this raises the possibility of the following events: a) Receive a second signal before leaving the signal routine. Is there any Unix variant in which multiple occurances of the same signal may not "stack"? b) Receive a signal during the longjmp. During a longjmp, is the stack guaranteed to be consistent enough for signal catching, i.e. about as consistent as in the midst of a function return? The signal catch routine would only check a global flag (telling it not to do anything) and set a global flag of its own. Is there any Unix variant in which this is not safe? Will it trash the stack? Perhaps the code will make it clearer: jmp_buf jbuf; int ready, caught; catch() { /* signal(SIGTRAP, catch); /* (not reset when caught - unneeded) */ caught++; if (!ready) /* longjmp'ing, or prerequisite work not finished */ return; ready = caught = 0; /* do some work whose response time is important */ kill(otherprocess, SIGTRAP); /* other process will do its urgent work, and send back a SIGTRAP */ /* meanwhile we go back to mainline code and get ready */ /* there are no live local variables anywhere at this point */ longjmp(jbuf, 1); } caller() { signal(SIGTRAP, catch); while (!eof) { /* do some prerequisite work */ /* we may or may not get a signal during this work */ if (setjmp(jbuf) == 0) { /* indicate that we're ready to act on the signal */ ready++; while (!caught) pause(); catch(); /*NOTREACHED*/ } } } Can I do this on all Unixes? (i.e. not just those with signal masking)? Don Speck speck@vlsi.caltech.edu {amdahl,scgvaxd}!cit-vax!speck