Das Zuhause des Powerhamsters

Lösung für Signalbehandlung

Problem:

Das Programm warten in einer Endlosschleife auf eingehende Verbindungen und lässt sich nur mit SIGINT (STRG+C) beenden.
Die Signale kann man über die funktion signal zwar global anfangen, dass bringt einem aber reichlich wenig wenn die Endlosschleife innerhalb einer Klasse läuft.

Lösung

Das Signal wird global abgefangen und als Exception weiter gereicht.

Codeschnipel C++
#include<csignal>
...
void sig_handler(int signr)
{
	if(signr == SIGINT)// SIGINT (STRG+C) wird als C++ Exception weiter gereicht
		throw signr;	// alle anderen Signale bleiben unbehandelt
	else
		raise(signr);
}
int main()
{
	...
	signal(SIGINT,sig_handler);
	...
}
  

Diese Exception kann man dann innerhalb der C++ Klasse wiederum abfangen und so verarbeiten das, dass Progamm normal beendet wird.

Codeschnipsel C++ (Server.cpp)
#include"Server.h"
...
#include"ColorMakro.h"
#include<string>
#include<iostream>
#include<pthread.h>
#include<csignal>
...
Server::Server(int port, int maxConnections)
:port(port), maxConnections(maxConnections)
{
	...
	pthread_t thread;
	typedef void * (*staticMemberFuncPtr)(void *);
	staticMemberFuncPtr func = &Server::interact;
	int cSocket;
	try
	{
		while(true)
		{
			...
		}
	}
	// Bei Signalen wird eine Exception geworfen welche hier abgefangen wird
	catch(int exception)
	{
		if(exception == SIGINT)
		{
			std::cout << BLUE("Sie haben STRG + C gedrückt!") << std::endl;
		}
		else
		{
			std::cerr << RED("Ausnahmefehler!") << std::endl;
		}
	}
}
  
Letze Änderung: 08.06.2008 03:29