During the developing phase of programs for my customers, I have to think that they can use the CTRL-C combo to interrupt the execution of my code. 

In some cases, for example in a program that makes only some computations, I can avoid catching this event.

In some other cases, for example when my program has activated a hardware watchdog timer which will reset the system, I must handle this event to deactivate the hardware timer.

To handle this event I use the signal() function from the signal.h library.

 

 

#include <signal.h>

void (*signal(int sig, void (*func)(int)))(int);


or in the equivalent but easier to read typedef'd version:

 

typedef void (*sig_t) (int);

sig_t signal(int sig, sig_t func);


This signal() facility is a simplified interface to the more general sigaction(2) facility.

Signals allow the manipulation of a process from outside its domain, as well as allowing the process to manipulate itself or copies of itself (children). for further information refer to man pages

man 3 signal

Here you are a sample program using the signal facility.

The signal() function at the start of main() function says that if there will be a CTRL-C (SIGNINT) event the control flow shall move to the safeExit() function. This function will perform all the operations needed to perform a safe exit from the program.

 

 

/*+————————————————————–+

  |           safeExit.c  –  description                         |

  |                ——————-                           |

  | begin      : 24/06/2011 19.00                                |

  | copyright  : ah ah ah                                        |

  | author     :                                                 |

  | email      :                                                 |

  | compiling  : gcc -o safeExit safeExit.c                      |

  |                                                              |

  +————————————————————–+*/


/*+————————————————————–+

  | SYSTEM INCLUDES                                              |

  +————————————————————–+*/

#include <stdio.h>

#include <stdlib.h>

#include <signal.h>

#include <unistd.h>


/*+————————————————————–+

  | PROTOTYPES                                                   |

  +————————————————————–+*/

void safeExit(int sig);

int main(int argc, char **argv);



void safeExit(int sig)


{

    printf("CTRL-C received, exiting program\n");

    exit(EXIT_SUCCESS);

}




int main(int argc, char **argv)

{

    signal(SIGINT, &safeExit);

    while(1)

    {

        sleep(1);

    }

    return(EXIT_SUCCESS);

}