
jmp_buf env;
int valid_env = 0;

void sig_handler(sig)
int sig;
{
        assert(sig >= 0 && sig < NSIG);

        if (!actions[sig]) {
                /* always an error except when sig == 0 */
                if (sig == 0) return;
                fprintf(stderr,"unexpected signal (%d) delivered\n", sig);
        } else {
                signal(sig, sig_handler);
                eval(actions[sig]);
        }

        if (valid_env) longjmp(env,1);
}

Listing 2

