9. What’s a signal? What do I use signals for?
A signal is an exceptional condition that occurs during the execution of your program. It might be the result of an error in your program, such as a reference to an illegal address in memory; or an error in your program’s data, such as a floating-point divided by 0; or an outside event, such as the user’s pressing Ctrl-Break. The standard library function signal() enables you to specify what action is to be taken on one of these exceptional conditions (a function that performs that action is called a “signal handler”). The prototype for signal() is
#include <signal.h>
void (*signal(int num, void (*func)(int)))(int);
which is just about the most complicated declaration you’ll see in the C standard library. It is easier to understand if you define a typedef first. The type sigHandler_t, shown next, is a pointer to a function that takes an int as its argument and returns a void:
typedef void (*sigHandler_t)(int);
ignal() is a function that takes an int and a sigHandler_t as its two arguments, and returns asigHandler_t as its return value. The function passed in as the func argument will be the new signal handler for the exceptional condition numbered num. The return value is the previous signal handler for signal num. This value can be used to restore the previous behavior of a program, after temporarily setting a signal handler. The possible values for num are system dependent and are listed in signal.h. The possible values for func are any function in your program, or one of the two specially defined values SIG_DFL or SIG_IGN. The SIG_DFL value refers to the system’s default action, which is usually to halt the program. SIG_IGN means that the signal is ignored.
The following line of code, when executed, causes the program containing it to ignore Ctrl-Break keystrokes unless the signal is changed again. Although the signal numbers are system dependent, the signal number SIGINT is normally used to refer to an attempt by the user to interrupt the program’s execution (Ctrl-C or Ctrl-Break in DOS):
signal(SIGINT, SIG_IGN);