55 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <stdio.h>
 | |
| #include <signal.h>
 | |
| 
 | |
| #include "helpers.h"
 | |
| 
 | |
| void got_signal(int s) {
 | |
| 	/*
 | |
| 	 * For demonstration purposes only!
 | |
| 	 *
 | |
| 	 * In real-world applications avoid the execution of complex
 | |
| 	 * tasks in signal handlers, this cries for race conditions and
 | |
| 	 * exploits.
 | |
| 	 *
 | |
| 	 * https://web.archive.org/web/20070204064240/http://www.bindview.com:80/
 | |
| 	 % Services/Razor/Papers/2001/signals.cfm
 | |
| 	 */
 | |
| 
 | |
| 	static int count = 2;
 | |
| 
 | |
| 	fprintf(stderr, "Caught Ctrl-C, press %i more time%s to really"
 | |
| 		" quit.\n", count, count == 1 ? "" : "s");
 | |
| 
 | |
| 	if (count-- > 1) {
 | |
| 		/* Catch subsequent SIGINTs */
 | |
| 		signal(SIGINT, got_signal);
 | |
| 	}
 | |
| 	else {
 | |
| 		/* Don't catch SIGINT anymore */
 | |
| 		signal(SIGINT, SIG_DFL);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| int main(void) {
 | |
| 	/*
 | |
| 	 * Initialization...
 | |
| 	 */
 | |
| 	void load_cfg(int x) // Wrapper um die inkompatibilität durch die fehlerhafte methodendeklaration zu beheben
 | |
| 	{
 | |
| 		load_config();
 | |
| 	}
 | |
| 	load_config();
 | |
| 	signal(SIGHUP, load_cfg); 
 | |
| 	signal(SIGINT, got_signal);
 | |
| 	signal(SIGKILL, SIG_IGN); // Unaufhaltsam, da SIGKILL sich ja eben genau nicht um das Programm kümmern soll, sondern einfach immer töten soll
 | |
| 	signal(SIGTERM, SIG_IGN); // Aufhaltbar
 | |
| 	
 | |
| 	/*
 | |
| 	 * Do some work.
 | |
| 	 */
 | |
| 
 | |
| 	main_loop();
 | |
| 
 | |
| 	return 0;
 | |
| }
 |