B
Hallo zusammen,
ich habe ein daemonize eingebaut was bei mir aber nicht funktioniert. Ich erhalte zwar einen Hintergrundprozess jedoch wird mein Server dadurch beendet, d. h. der Prozess ist da aber er antwortet auf HTTP nicht. Ohne daemonize() aber funktioniert es.
#ifdef WIN32
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#else
//Quelle http://www.enderunix.org/docs/eng/daemon.php
//abgeändert für c++, da sonst Fehler bzgl. Prototypdefinition erfolgen
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#define RUNNING_DIR "/tmp"
#define LOCK_FILE "blubb.lock"
#define LOG_FILE "blubb.log"
void log_message(char *filename,char *message)
{
FILE *logfile;
logfile=fopen(filename,"a");
if(!logfile) return;
fprintf(logfile,"%s\n",message);
fclose(logfile);
}
void signal_handler(int sig)
{
switch(sig) {
case SIGHUP:
log_message(LOG_FILE,"hangup signal catched");
break;
case SIGTERM:
log_message(LOG_FILE,"terminate signal catched");
exit(0);
break;
}
}
void daemonize()
{
int i,lfp;
char str[10];
if(getppid()==1) return; /* already a daemon */
i=fork();
if (i<0) exit(1); /* fork error */
if (i>0) exit(0); /* parent exits */
/* child (daemon) continues */
setsid(); /* obtain a new process group */
for (i=getdtablesize();i>=0;--i) close(i); /* close all descriptors */
i=open("/dev/null",O_RDWR); dup(i); dup(i); /* handle standart I/O */
umask(027); /* set newly created file permissions */
chdir(RUNNING_DIR); /* change running directory */
lfp=open(LOCK_FILE,O_RDWR|O_CREAT,0640);
if (lfp<0) exit(1); /* can not open */
if (lockf(lfp,F_TLOCK,0)<0) exit(0); /* can not lock */
/* first instance continues */
sprintf(str,"%d\n",getpid());
write(lfp,str,strlen(str)); /* record pid to lockfile */
signal(SIGCHLD,SIG_IGN); /* ignore child */
signal(SIGTSTP,SIG_IGN); /* ignore tty signals */
signal(SIGTTOU,SIG_IGN);
signal(SIGTTIN,SIG_IGN);
signal(SIGHUP,signal_handler); /* catch hangup signal */
signal(SIGTERM,signal_handler); /* catch kill signal */
}
int main(int argc, char** argv) {
struct mg_context *ctx;
const char *options[] = {"listening_ports", "9999", NULL};
ctx = mg_start(&Service::mongooseCallbackStatic, NULL, options);
#ifndef WIN32
// TODO http://www.enderunix.org/docs/eng/daemon.php
daemonize();
#endif
getchar(); // Wait until user hits "enter"
//RestService::destroy();
//mg_stop(ctx);
return 0;
}
Also das hier ist mein letzter Versuch. Ich verwende mongoose einen C Webserver welcher wohl einen Thread öffnet, es wird im folgenden auch noch mehrere Threads gestartet.
Könnte mir bitte Jemand weiterhelfen? Ach ja Zielumgebung ist sowohl Win als auch Linux.
Daemonize unter Linux ist absolutes Neuland für mich, d. h. ich habe diesen Example Code siehe Comment auch nicht selbst erfunden.
Vielen Dank für jedwede Hilfe