This is an example for the usage of libdaemon
#include <signal.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/unistd.h>
#include <sys/select.h>
int main(int argc, char *argv[]) {
pid_t pid;
daemon_log(LOG_ERR,
"Failed to reset all signal handlers: %s", strerror(errno));
return 1;
}
daemon_log(LOG_ERR,
"Failed to unblock all signals: %s", strerror(errno));
return 1;
}
if (argc >= 2 && !strcmp(argv[1], "-k")) {
int ret;
daemon_log(LOG_WARNING,
"Failed to kill daemon: %s", strerror(errno));
return ret < 0 ? 1 : 0;
}
daemon_log(LOG_ERR,
"Daemon already running on PID file %u", pid);
return 1;
}
return 1;
}
return 1;
} else if (pid) {
int ret;
daemon_log(LOG_ERR,
"Could not receive return value from daemon process: %s", strerror(errno));
return 255;
}
daemon_log(ret != 0 ? LOG_ERR : LOG_INFO,
"Daemon returned %i as return value.", ret);
return ret;
} else {
int fd, quit = 0;
fd_set fds;
daemon_log(LOG_ERR,
"Failed to close all file descriptors: %s", strerror(errno));
goto finish;
}
daemon_log(LOG_ERR,
"Could not create PID file (%s).", strerror(errno));
goto finish;
}
daemon_log(LOG_ERR,
"Could not register signal handlers (%s).", strerror(errno));
goto finish;
}
FD_ZERO(&fds);
FD_SET(fd, &fds);
while (!quit) {
fd_set fds2 = fds;
if (select(FD_SETSIZE, &fds2, 0, 0, 0) < 0) {
if (errno == EINTR)
continue;
daemon_log(LOG_ERR,
"select(): %s", strerror(errno));
break;
}
if (FD_ISSET(fd, &fds2)) {
int sig;
daemon_log(LOG_ERR,
"daemon_signal_next() failed: %s", strerror(errno));
break;
}
switch (sig) {
case SIGINT:
case SIGQUIT:
case SIGTERM:
daemon_log(LOG_WARNING,
"Got SIGINT, SIGQUIT or SIGTERM.");
quit = 1;
break;
case SIGHUP:
break;
}
}
}
finish:
return 0;
}
}