/*-------------------------------------------------------------------*/ /* testsignal.c */ /* The signal system call. */ /*-------------------------------------------------------------------*/ #include #include #include /*-------------------------------------------------------------------*/ void mySignalHandler(int iSignal) /* This function is intended to be a handler for signals of various types. Print iSignal to stdout, and then re-register this function as the handler for signals of type iSignal. */ { void (*pfRet)(int); printf("In mySignalHandler with argument %d\n", iSignal); pfRet = signal(iSignal, mySignalHandler); assert(pfRet != SIG_ERR); } /*-------------------------------------------------------------------*/ int main(int argc, char *argv[]) /* Illustrate the signal function. Note that this program can be exited only by sending it a SIGKILL signal from another terminal. */ { void (*pfRet)(int); pfRet = signal(SIGHUP, mySignalHandler); /* 1 */ assert(pfRet != SIG_ERR); pfRet = signal(SIGINT, mySignalHandler); /* 2 (generated by ^C) */ assert(pfRet != SIG_ERR); pfRet = signal(SIGQUIT, mySignalHandler); /* 3 (generated by ^\) */ assert(pfRet != SIG_ERR); pfRet = signal(SIGILL, mySignalHandler); /* 4 */ assert(pfRet != SIG_ERR); pfRet = signal(SIGTRAP, mySignalHandler); /* 5 */ assert(pfRet != SIG_ERR); pfRet = signal(SIGABRT, mySignalHandler); /* 6 */ assert(pfRet != SIG_ERR); pfRet = signal(SIGBUS, mySignalHandler); /* 7 */ assert(pfRet != SIG_ERR); pfRet = signal(SIGFPE, mySignalHandler); /* 8 */ assert(pfRet != SIG_ERR); pfRet = signal(SIGKILL, mySignalHandler); /* 9 (should fail) */ assert(pfRet == SIG_ERR); pfRet = signal(SIGUSR1, mySignalHandler); /* 10 */ assert(pfRet != SIG_ERR); pfRet = signal(SIGSEGV, mySignalHandler); /* 11 */ assert(pfRet != SIG_ERR); pfRet = signal(SIGUSR2, mySignalHandler); /* 12 */ assert(pfRet != SIG_ERR); pfRet = signal(SIGPIPE, mySignalHandler); /* 13 */ assert(pfRet != SIG_ERR); pfRet = signal(SIGALRM, mySignalHandler); /* 14 (generated by alarms) */ assert(pfRet != SIG_ERR); pfRet = signal(SIGTERM, mySignalHandler); /* 15 (default from kill cmd) */ assert(pfRet != SIG_ERR); pfRet = signal(SIGCHLD, mySignalHandler); /* 17 */ assert(pfRet != SIG_ERR); pfRet = signal(SIGCONT, mySignalHandler); /* 18 */ assert(pfRet != SIG_ERR); pfRet = signal(SIGSTOP, mySignalHandler); /* 19 (should fail) */ assert(pfRet == SIG_ERR); pfRet = signal(SIGTSTP, mySignalHandler); /* 20 (generated by ^Z) */ assert(pfRet != SIG_ERR); pfRet = signal(SIGTTIN, mySignalHandler); /* 21 */ assert(pfRet != SIG_ERR); pfRet = signal(SIGTTOU, mySignalHandler); /* 22 */ assert(pfRet != SIG_ERR); pfRet = signal(SIGURG, mySignalHandler); /* 23 */ assert(pfRet != SIG_ERR); pfRet = signal(SIGXCPU, mySignalHandler); /* 24 */ assert(pfRet != SIG_ERR); pfRet = signal(SIGXFSZ, mySignalHandler); /* 25 */ assert(pfRet != SIG_ERR); pfRet = signal(SIGVTALRM, mySignalHandler); /* 26 */ assert(pfRet != SIG_ERR); pfRet = signal(SIGPROF, mySignalHandler); /* 27 (for profilers) */ assert(pfRet != SIG_ERR); pfRet = signal(SIGWINCH, mySignalHandler); /* 28 */ assert(pfRet != SIG_ERR); pfRet = signal(SIGIO, mySignalHandler); /* 29 */ assert(pfRet != SIG_ERR); pfRet = signal(SIGPWR, mySignalHandler); /* 30 */ assert(pfRet != SIG_ERR); pfRet = signal(SIGSYS, mySignalHandler); /* 31 */ assert(pfRet != SIG_ERR); pfRet = signal(SIGRTMIN, mySignalHandler); /* 32 */ assert(pfRet != SIG_ERR); pfRet = signal(SIGRTMIN, mySignalHandler); /* 33 */ assert(pfRet != SIG_ERR); printf("Entering an infinite loop\n"); for (;;) ; return 0; } /* Sample execution: $ gcc -Wall -ansi -pedantic -o testsignal testsignal.c $ testsignal Entering an infinite loop ^CIn mySignalHandler with argument 2 ^\In mySignalHandler with argument 3 ^ZIn mySignalHandler with argument 20 */