Below I quote a simple implementation in C that you can use in your applications for the management of software signals in POSIX operating systems (such as the GNU/Linux). Of course, this implementation comes from a personal project of the past, especially where I grappled with system programming. You can modify this implementation to work best with your needs.
Source code of the implementation:
/* * signals_handling.c -- signals handling support. * * Copyright (C) 2007 Efstathios Chatzikyriakidis (stathis.chatzikyriakidis@gmail.com) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ /* standard libraries' includes. */ #include <stdlib.h> #include <syslog.h> #include <sys/types.h> #include <sys/wait.h> #include <signal.h> /* function prototypes. */ static void term_handler (const int sig); static void chld_handler (const int sig); static void signals_handler (const int sig); void signals_support (const int state); /* the following function cleans up all the zombie processes each time is called. is a handler for the `SIGCHLD' signal. */ static void chld_handler (const int sig) { /* are used for cleaning up zombies. */ int status; pid_t pid; /* clean up all zombie processes. */ while ((pid = waitpid (-1, &status, WNOHANG)) > 0); /* status variables may be used in future. */ } /* the following function is `SIGTERM' signal's handler. */ static void term_handler (const int sig) { /* log informative message. */ syslog (LOG_INFO, "termination signal found."); /* terminate the program. */ exit (EXIT_FAILURE); } /* the following function is called when a new fresh signal occures. then calls a specific handler depending for that signal. */ static void signals_handler (const int sig) { switch (sig) { case SIGTERM: term_handler (sig); break; case SIGCHLD: chld_handler (sig); break; default: /* for all the other signals. */ syslog (LOG_INFO, "signal found: `%d'.", sig); break; } } /* the following function enables or disables signals handling support. */ void signals_support (const int state) { /* is used for handling the signals. */ register int i; /* enable signals handler. */ if (state) for (i = SIGHUP; i <= SIGTERM; i++) signal (i, signals_handler); /* disable signals handler. */ if (!state) for (i = SIGHUP; i <= SIGTERM; i++) signal (i, SIG_IGN); }