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;
|
|
}
|