Signal Handling Example (linux C/C++)
#include <iostream>
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <fstream>
class TestClass{
public:
static void handle_signal(int signal);
};
void TestClass::handle_signal(int signal) {
//char *signalName;
std::string signalName = "";
sigset_t pending;
switch(signal) {
case SIGHUP:
signalName = "SIGHUP";
break;
case SIGINT:
signalName = "SIGINT";
break;
case SIGTERM:
signalName = "SIGTERM";
break;
case SIGQUIT:
signalName = "SIGQUIT";
break;
case SIGKILL:
signalName = "SIGKILL";
break;
default:
printf("Caught unknown signal: %d\n", signal);
return;
}
//실행하고 싶은 함수
std::ofstream outFile("./output.txt", std::ios::app);
printf("Linux signal occurred. signal[%d] : name[%s]\n", signal, signalName.c_str());
std::string str(std::string("Linux signal occurred. signal[") + std::to_string(signal) + "] signal Name["+ std::string(signalName) + "]");
outFile << str << std::endl;
outFile.close();
//exit(0);
}
int main(int argc, char* arv[]) {
TestClass *A = new TestClass();
struct sigaction signalhandler;
//stack_t sigstk; //for seg.fault
//if ((sigstk.ss_sp = (char *)//malloc(SIGSTKSZ*2))==NULL) {
//fprintf(stderr, "can't alloc alt stack\n");
//}
//sigstk.ss_size = SIGSTKSZ*2;
//sigstk.ss_flags = 0;
//if(sigaltstack(&sigstk, (stack_t *) 0) < 0) {
//perror("sigaltstack");
//}
signalhandler.sa_handler = &TestClass::handle_signal;
sigemptyset(&signalhandler.sa_mask);
signalhandler.sa_flags = SA_RESETHAND | SA_ONSTACK;
sigaction(SIGSEGV, &signalhandler,NULL);
sigaction(SIGHUP, &signalhandler,NULL);
sigaction(SIGINT, &signalhandler,NULL);
sigaction(SIGTERM, &signalhandler,NULL);
sigaction(SIGQUIT, &signalhandler,NULL);
sigaction(SIGKILL, &signalhandler,NULL);
while(1) {
}
return 1;
}
#Signal #Signal Handling #Signal Handler #C #C++ #Linux #Embedded