Brief description of class still missing. More...
#include <DaemonApplication.h>
Public Member Functions | |
| const std::string & | basePath () const |
| virtual void | close () |
| DaemonApplication (int &argc, char **argv, ApplicationHelp *(*help)(), bool reportBugs=true) | |
| void | fork () |
| void | start () |
| ~DaemonApplication () | |
Protected Member Functions | |
| virtual void | installInterruptSignals () |
| virtual void | parentProcessWait () |
Static Protected Member Functions | |
| static void | childInterrupted (int signum) |
| static void | parentInterrupted (int signum) |
Brief description of class still missing.
Full description of class still missing
| GpCoreTools::DaemonApplication::DaemonApplication | ( | int & | argc, |
| char ** | argv, | ||
| ApplicationHelp *(*)() | help, | ||
| bool | reportBugs = true |
||
| ) |
Description of constructor still missing
References GpCoreTools::CoreApplication::checkOptionArg(), GpCoreTools::CoreApplication::exit(), and help().
: CoreApplication(argc, argv, 0, reportBugs) { _doFork=true; _basePath="/var/log"; // Check arguments int i, j=1; for(i=1; i<argc; i++) { const char * arg=argv[i]; if(strcmp(arg, "-N")==0) { _doFork=false; } else if(strcmp(arg, "-b")==0) { checkOptionArg(i, argc, argv, true); _basePath=argv[i]; } else if(strcmp(arg, "-l")==0) { checkOptionArg(i, argc, argv, true); _logFileName=argv[i]; } else if(help && (strcmp(arg, "--help")==0 || strcmp(arg, "-help")==0 || strcmp(arg, "-h")==0)) { showHelp(i, argc, argv, help); ::exit(0); } else { argv[j++]=argv[i]; } } if(j<argc) { argv[j]=0; argc=j; } if(_doFork) { checkPidFile(); } checkBasePath(); initLogFile(); // Allocate it after initializing log _leds=new Leds; }
{
delete _leds;
}
| const std::string& GpCoreTools::DaemonApplication::basePath | ( | ) | const [inline] |
Referenced by main().
{return _basePath;}
| void GpCoreTools::DaemonApplication::childInterrupted | ( | int | signum | ) | [static, protected] |
Reimplemented in GpsDaemonApplication, and CubeDaemonApplication.
References GpCoreTools::EventLoop::mainInstance(), GpCoreTools::EventLoop::terminate(), and GpCoreTools::Log::writeNoMutex().
Referenced by installInterruptSignals().
{
// Do not use TRACE here because it uses a mutex which can be locked while this function
// is called inside a signal exception.
Log::writeNoMutex(0, "received TERM or INTERRUPT signal\n");
EventLoop::mainInstance()->terminate();
// Returns to default handler in case the process did not stop properly
signal(SIGTERM, SIG_DFL);
signal(SIGINT, SIG_DFL);
}
| void GpCoreTools::DaemonApplication::close | ( | ) | [virtual] |
Description of destructor still missing
Reimplemented from GpCoreTools::CoreApplication.
Reimplemented in GpsDaemonApplication, and CubeDaemonApplication.
References GpCoreTools::CoreApplication::applicationName(), and GpCoreTools::Log::write().
Referenced by main().
{
Log::write(0, "stop daemon with pid %i\n",getpid());
remove(pidFile(applicationName()).data());
CoreApplication::close();
}
| void GpCoreTools::DaemonApplication::fork | ( | ) |
References GpCoreTools::CoreApplication::exit(), GpCoreTools::CoreApplication::initInternalDebugger(), parentInterrupted(), parentProcessWait(), and GpCoreTools::Log::write().
Referenced by main().
{
if(_doFork) {
// Our process ID and Session ID
pid_t pid, sid;
pid=::fork();
if(pid<0) { // Error, no child is created, -1 is returned to parent
Log::write(0, "cannot fork off the parent process: %s\n", strerror(errno));
exit(2);
}
// If we got a good PID, then we can exit the parent process.
if(pid>0) {
writePidFile(pid);
// Eventually wait before exiting
signal(SIGTERM, parentInterrupted);
signal(SIGINT, parentInterrupted);
parentProcessWait();
::exit(0); // Exits silently
}
// pid is null, hence we are in the child process
// Change the file mode mask
umask(0);
// Create a new SID for the child process
sid=setsid();
if(sid < 0) {
Log::write(0, "cannot create a new SID for the child process\n");
exit(2);
}
initInternalDebugger();
}
}
| void GpCoreTools::DaemonApplication::installInterruptSignals | ( | ) | [protected, virtual] |
Reimplemented in GpsDaemonApplication, and CubeDaemonApplication.
References childInterrupted().
Referenced by start().
{
signal(SIGTERM, childInterrupted);
signal(SIGINT, childInterrupted);
}
| void GpCoreTools::DaemonApplication::parentInterrupted | ( | int | signum | ) | [static, protected] |
References GpCoreTools::CoreApplication::applicationName(), GpCoreTools::CoreApplication::exit(), and GpCoreTools::CoreApplication::instance().
Referenced by fork().
{
// Kill child process
std::string pf=pidFile(CoreApplication::instance()->applicationName());
FILE * fpid=fopen(pf.data(), "rt");
if(fpid) {
pid_t pid;
if(fscanf(fpid, "%u\n", &pid)==1) {
kill(pid, SIGINT);
}
fclose(fpid);
}
// Nicer output of runscript if parent process is printing messages
printf("\n");
exit(2);
}
| virtual void GpCoreTools::DaemonApplication::parentProcessWait | ( | ) | [inline, protected, virtual] |
References installInterruptSignals(), and GpCoreTools::Log::write().
Referenced by main().
{
installInterruptSignals();
Log::write(0, "start new daemon with pid %i\n",getpid());
}