C++ Daemon blockiert Serveranwendung

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Payne_of_Death
Beiträge: 484
Registriert: 16.05.2004 20:21:30
Kontaktdaten:

C++ Daemon blockiert Serveranwendung

Beitrag von Payne_of_Death » 23.11.2011 09:43:40

Hallo zusammen,

ich habe eine Serveranwendung welche auf der Mongoose Webserver API aufsetzt und bislang immer via Commandline gestartet wurde.

Nachdem ich mir ein Beispiel für einen C++ Daemon besorgt hatte und dieses eingebaut habe. Hatte ich diverse Probleme erhalten bei denen ich nun überfragt bin.

Problem: Habe festgestellt das der Server gar nicht auf HTTP Anfragen reagiert
Lösung: while(1) ans Ende gesetzt?

Problem: Unter Linux erhalte ich Ressourcen Probleme, d. h. Ressourcen die in der Konsolenanwendung geladen werden konnten werden so nicht gefunden
Lösung: offen

Problem: Embedded Hardware mit Busybox lässt keine Verbindung mit dem HTTP Server zu, Client hängt fest (Konsolenanwendung hingegen nicht)
Lösung: offen

Problem: Wie debugge ich den Daemon bzw. wie kann ich herausfinden was hier schief geht. Benötige ja das Logfile

Hoffe mir kann Jemand einen Rat geben (habe dies übrigens in einer C++ Community ebenfalls gepostet jedoch bisher ohne Ergebnis)

Code: Alles auswählen

#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"
  
  return 0;
}
Das System was mich zu Fall bringt muss erst mal geboren werden.

Benutzeravatar
h-man
Beiträge: 745
Registriert: 05.02.2003 13:10:08
Wohnort: Berlin
Kontaktdaten:

Re: C++ Daemon blockiert Serveranwendung

Beitrag von h-man » 23.11.2011 09:48:03

vielleicht kannst du mit dem programm "netstat" den zustand der verbindungen herausfinden.
man netstat
Nieder mit der Schwerkraft.

Benutzeravatar
Payne_of_Death
Beiträge: 484
Registriert: 16.05.2004 20:21:30
Kontaktdaten:

Re: C++ Daemon blockiert Serveranwendung

Beitrag von Payne_of_Death » 23.11.2011 10:45:29

h-man hat geschrieben:vielleicht kannst du mit dem programm "netstat" den zustand der verbindungen herausfinden.
man netstat
Also auf Linux Seit (Ubuntu) läuft es mittlerweile....Komischerweise aber nicht unter dem Embedded System mit ner BusyBox.

Bei der Busybox hängt der Client und es wird nichts in syslog geschrieben...Ich installiere mir jetzt mal eine busybox mit start-stop-daemon evtl. hilft mir das dort zumindest weiter
Das System was mich zu Fall bringt muss erst mal geboren werden.

Benutzeravatar
Payne_of_Death
Beiträge: 484
Registriert: 16.05.2004 20:21:30
Kontaktdaten:

Re: C++ Daemon blockiert Serveranwendung

Beitrag von Payne_of_Death » 23.11.2011 13:40:35

Wenn ich es so aufrufe geht es komischerweise?

start-stop-daemon -S -x ./progi -b -p progi.pid -m

und das geht ebenfalls
start-stop-daemon -K -p progi.pid

Wieso aber nicht mit C++?
Das System was mich zu Fall bringt muss erst mal geboren werden.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: C++ Daemon blockiert Serveranwendung

Beitrag von Cae » 23.11.2011 19:53:21

strace sollte zum Debuggen recht nützlich sein. Sonst auch nc (netcat) und netstat, lsof und iftop.

Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Re: C++ Daemon blockiert Serveranwendung

Beitrag von cosmac » 23.11.2011 20:22:44

hi,

falls dein C++ noch Ähnlichkeit mit dem aus dem ersten Post hat:
probier mal, mg_start() nach daemonize(), also so:

Code: Alles auswählen

#ifndef WIN32
  daemonize();
#endif
  ctx = mg_start(&Service::mongooseCallbackStatic, NULL, options);
es gibt auch eine fertige Funktion, die im Wesentlichen das gleiche macht wie daemonize():

Code: Alles auswählen

#ifndef WIN32
  daemon (1, 1);
#endif
  ctx = mg_start(&Service::mongooseCallbackStatic, NULL, options);
Beware of programmers who carry screwdrivers.

Benutzeravatar
Payne_of_Death
Beiträge: 484
Registriert: 16.05.2004 20:21:30
Kontaktdaten:

Re: C++ Daemon blockiert Serveranwendung

Beitrag von Payne_of_Death » 24.11.2011 11:42:21

cosmac hat geschrieben:hi,

falls dein C++ noch Ähnlichkeit mit dem aus dem ersten Post hat:
probier mal, mg_start() nach daemonize(), also so:

Code: Alles auswählen

#ifndef WIN32
  daemonize();
#endif
  ctx = mg_start(&Service::mongooseCallbackStatic, NULL, options);
es gibt auch eine fertige Funktion, die im Wesentlichen das gleiche macht wie daemonize():

Code: Alles auswählen

#ifndef WIN32
  daemon (1, 1);
#endif
  ctx = mg_start(&Service::mongooseCallbackStatic, NULL, options);
So wie du das hier hast habe ich das im Endeffekt mittlerweile auch zumindest war es meine Ursprungsversion.

Die an und für sich ja auch sinnig ist, da alles nach daemonize bzw. der bereits in linux enthaltenen daemon() Fkt. im neuen Fork ausgeführt wird.

Die Geschichte mit dem start-stop-daemon funktioniert zwar auf dem Embedded System jedoch auf Debian bzw. Ubuntu nicht.

Jedoch macht der start-stop-daemon ja auch nichts anderes als ich hier versuche
Das System was mich zu Fall bringt muss erst mal geboren werden.

Antworten