#include #include static int counter = 0; static int killed = 0; int killit () { killed++; return kill (getpid (), (killed & 1) ? SIGUSR1 : SIGHUP); } int killit0 () { return killit (); } int ouch (int sig) { int real_counter = counter & ~0x400000; int recursed = real_counter & counter; counter = real_counter; if ((++counter & 1) || (counter < 10)) killit0 (); printf ("sig %d, counter %d%s\n", sig, counter, recursed ? ", recursed" : ""); sig = 27; counter |= 0x400000; } int bye (int sig) { printf ("sig %d, kill counter %d, counter %d\n", sig, killed, counter); exit (0); } int main (int argc, char **argv) { signal (SIGHUP, ouch); signal (SIGUSR1, ouch); signal (SIGINT, bye); while (killit () == 0) { counter &= ~0x400000; puts ("sent"); } }