Sunday 13 November 2011

What’s a signal? What do I use signals for? in C programming

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);
sigHandler_t signal(int num, sigHandler_t func);

signal() is a function that takes an int and a sigHandler_t as its two arguments, and returns a sigHandler_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 thesignal 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);

Cross Reference:

XX.16: How do you disable Ctrl-Break?

No comments:

Post a Comment