#include #include #define MAXDEPTH 10 int depth = 0; int maxdepth = MAXDEPTH; onintr(signo, code, sc) struct sigcontext *sc; { int x; printf("sig=%u, code=%u, onstack=%u, mask=%u, sp=%x, pc=%x, ps=%x\n", signo, code, sc->sc_onstack, sc->sc_mask, sc->sc_sp, sc->sc_pc, sc->sc_ps); printf("handler local var: &x=%x\n", &x); sigsetmask(0); if (++depth < maxdepth) kill(getpid(), SIGHUP); printf("onintr...return\n"); } onhup(signo, code, sc) struct sigcontext *sc; { int x; printf("sig=%u, code=%u, onstack=%u, mask=%u, sp=%x, pc=%x, ps=%x\n", signo, code, sc->sc_onstack, sc->sc_mask, sc->sc_sp, sc->sc_pc, sc->sc_ps); printf("handler local var: &x=%x\n", &x); sigsetmask(0); if (++depth < maxdepth) kill(getpid(), SIGINT); printf("onhup...return\n"); } char stack[1024]; main(argc, argv) char *argv[]; { struct sigvec sv; struct sigstack ss; if (argc > 1) { maxdepth = atoi(argv[1]); if (maxdepth <= 0) maxdepth = MAXDEPTH; } ss.ss_sp = stack + sizeof (stack) - 1; /* grows down on vax */ ss.ss_onstack = 0; if (sigstack(&ss, (struct sigstack *)0) < 0) perror("sigstack"); sv.sv_handler = onintr; sv.sv_mask = 0; #ifdef notdef sv.sv_onstack = argc > 1; #else sv.sv_onstack = 0; #endif if (sigvec(SIGINT, &sv, (struct sigvec *)0) < 0) perror("sigvec"); sv.sv_handler = onhup; sv.sv_mask = 0; sv.sv_onstack = argc > 1; if (sigvec(SIGHUP, &sv, (struct sigvec *)0) < 0) perror("sigvec (SIGHUP)"); for (;;) { depth = 0; sigpause(0); } }