Linux
Application Development |
Michael K. Johnson Erik W. Troan |
/* sighup.c -- sample program which illustrates how to use sighup to force a daemon to reopen its log files */ #include <errno.h> #include <signal.h> #include <stdio.h> #include <string.h> #include <unistd.h> volatile int reopenLog = 0; /* volatile as it is modified by a signal handler */ /* write a line to the log */ void logstring(int logfd, char * str) { write(logfd, str, strlen(str)); } /* When SIGHUP occurs, make a note of it and continue. */ void hupHandler(int signum) { reopenLog = 1; } int main() { int done = 0; struct sigaction sa; int rc; int logfd; logfd = STDOUT_FILENO; /* Set up a signal handler for SIGHUP. Use memset() to initialize the struct sigaction to be sure we clear all of it. */ memset(&sa, 0, sizeof(sa)); sa.sa_handler = hupHandler; if (sigaction(SIGHUP, &sa, NULL)) perror("sigaction"); /* Log a message every two seconds, and reopen the log file as requested by SIGHUP. */ while (!done) { /* sleep() returns nonzero if it didn't sleep long enough */ rc = sleep(2); if (rc) { if (reopenLog) { logstring(logfd, "* reopening log files at SIGHUP's request\n"); reopenLog = 0; } else { logstring(logfd, "* sleep interrupted by unknown signal " "-- dying\n"); done = 1; } } else { logstring(logfd, "Periodic message\n"); } } return 0; }