В настоящее время я пытаюсь создать обработчик сигнала, который при получении сигнала SIGTERM закрывает открытые сетевые сокеты и файловые дескрипторы.
Вот моя функция SigHandler
static void SigHandler(int signo){
if(signo == SIGTERM){
log_trace("SIGTERM received - handling signal");
CloseSockets();
log_trace("SIGTERM received - All sockets closed");
if (closeFile() == -1)
log_trace("SIGTERM received - No File associated with XXX open - continuing with shutdown");
else
log_trace("SIGTERM received - Closed File Descriptor for XXX - continuing with shutdown");
log_trace("Gracefully shutting down XXX Service");
} else {
log_trace("%d received - incompatible signal");
return;
}
exit(0);
}
Этот код ниже находится в основном
if (sigemptyset(&set) == SIGEMPTYSET_ERROR){
log_error("Signal handling initialization failed");
}
else {
if(sigaddset(&set, SIGTERM) == SIGADDSET_ERROR) {
log_error("Signal SIGTERM not valid");
}
action.sa_flags = 0;
action.sa_mask = set;
action.sa_handler = &SigHandler;
if (sigaction(SIGTERM, &action, NULL) == SIGACTION_ERROR) {
log_error("SIGTERM handler initialization error");
}
}
Когда я отправляю kill -15 PID, ничего не происходит. Процесс не завершается, и при этом он не становится процессом зомби (не так, как он должен в любом случае). Однако я вижу печать следов в функции SigHandler, так что я знаю, что она достигает этой точки в коде. Просто кажется, что когда дело доходит до выхода (0), это не работает.
Когда я отправляю SIGKILL (kill -9 PID), он просто отлично убивает процесс.
Извиняюсь, если это расплывчато, я все еще плохо знаком с C, UNIX и т. Д., Так что я совершенно незнаком с большей частью того, как это работает на низком уровне.