I used the following guide (http://peterlombardo.wikidot.com/linux-daemon-in-c) and it works fine and beautifully, accept it wont kill.
Main.cpp
//Global Directives
//#define DEBUG 1
#define DAE_NAME "dae"
#define DAE_PID "/var/run/dae.pid"
//Includes
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <sstream>
#include <string>
#include <fstream>
#include <iomanip>
#include <vector>
#include <syslog.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <assert.h>
#include <signal.h>
//Namespace (System)
using namespace std;
//Classes
#include "class.h"
//Structures
#include "struct/struct.h"
//Functions
#include "function/signal_handler.h"
void usage(int argc, char *argv[]) {
if (argc >=1) {
printf("Usage: %s -h -nn", argv[0]);
printf(" Options:n");
printf(" -ntDon't fork off as a daemon.n");
printf(" -htShow this help screen.n");
printf("n");
}
}
int main(int argc, char *argv[]) {
#if defined(DEBUG)
int daemonize = 0;
#else
int daemonize = 1;
#endif
// Setup signal handling before we start
signal(SIGHUP, signal_handler);
signal(SIGTERM, signal_handler);
signal(SIGINT, signal_handler);
signal(SIGQUIT, signal_handler);
//Print Usage Information
int c;
while((c = getopt(argc, argv, "nh|help")) != -1) {
switch(c){
case 'h':
usage(开发者_JAVA技巧argc, argv);
exit(0);
break;
case 'n':
daemonize = 0;
break;
default:
usage(argc, argv);
exit(0);
break;
}
}
// Setup syslog logging
#if defined(DEBUG)
setlogmask(LOG_UPTO(LOG_DEBUG));
openlog(DAE_NAME, LOG_CONS | LOG_NDELAY | LOG_PERROR | LOG_PID, LOG_USER);
#else
setlogmask(LOG_UPTO(LOG_INFO));
openlog(DAE_NAME, LOG_CONS, LOG_USER);
#endif
//------------
//Daemon Setup
//------------
pid_t pid, sid;
if (daemonize) {
syslog(LOG_INFO, "Starting %s", DAE_NAME);
/* Fork off the parent process */
pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
}
/* If we got a good PID, then
we can exit the parent process. */
if (pid > 0) {
exit(EXIT_SUCCESS);
}
/* Change the file mode mask */
umask(0);
/* Create a new SID for the child process */
sid = setsid();
if (sid < 0) {
/* Log the failure */
exit(EXIT_FAILURE);
}
/* Change the current working directory */
if ((chdir("/")) < 0) {
/* Log the failure */
exit(EXIT_FAILURE);
}
/* Close out the standard file descriptors */
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
}
int count = 1;
//-------
//Process
//-------
while (1){
process();
syslog (LOG_INFO, "%s Processed(%s, %d)", DAE_NAME, getlogin(), count);
count++;
}
syslog (LOG_INFO, "Exiting Daemon %s", DAE_NAME);
closelog (); //Close the Connection
exit(EXIT_SUCCESS);
}
singal_handler.h
#ifndef SIGNAL_HANDLER_H_
#define SIGNAL_HANDLER_H_
void signal_handler(int sig) {
switch(sig) {
case SIGHUP:
syslog(LOG_WARNING, "Received SIGHUP signal.", DAE_NAME);
break;
case SIGTERM:
syslog(LOG_WARNING, "Received SIGTERM signal.", DAE_NAME);
break;
default:
syslog(LOG_WARNING, "Unhandled signal ", DAE_NAME);
break;
}
}
#endif
Command Line
So in the command line i run this
./dae
And then i run
kill procid
Logs
INFROMATIONAL, Starting dae
INFORMATIONAL, dae Processed((null), 1)
INFORMATIONAL, dae Processed((null), 2)
INFORMATIONAL, dae Processed((null), 3)
WARNING, Received SIGTERM signal.
INFORMATIONAL, dae Processed((null), 4)
INFORMATIONAL, dae Processed((null), 5)
The damn thing is not stopping? Any ideas thanks
Since you're handling the TERM signal, its default behavior is disabled.
You need to explicitly call exit() from your signal handler for your program to terminate.
Here is an implementation that allows cleanup and doesn't use atexit():
signal_handler.h
#ifndef SIGNAL_HANDLER_H_
#define SIGNAL_HANDLER_H_
extern bool g_terminated;
void signal_handler(int sig) {
switch(sig) {
case SIGHUP:
syslog(LOG_WARNING, "Received SIGHUP signal.", DAE_NAME);
break;
case SIGTERM:
syslog(LOG_WARNING, "Received SIGTERM signal.", DAE_NAME);
g_terminated = true;
break;
default:
syslog(LOG_WARNING, "Unhandled signal ", DAE_NAME);
break;
}
}
#endif
main.cpp
bool g_terminated = false;
int main(int argc, char *argv[])
{
.
.
.
//-------
//Process
//-------
while (!g_terminated) {
process();
syslog (LOG_INFO, "%s Processed(%s, %d)", DAE_NAME, getlogin(), count);
count++;
}
// Cleanup...
exit(EXIT_SUCCESS);
}
精彩评论