Elaborato_SO/src/custom_sig.c

107 lines
2.5 KiB
C
Raw Normal View History

2023-05-21 11:53:23 +02:00
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/msg.h>
#include <sys/msg.h>
#include <custom_sig.h>
#include <structures.h>
static int sigint_count = 2;
void setSignal(int sig);
void sigHandlerServer(int sig) {
if (sig == SIGINT) {
sigint_count--;
if (sigint_count > 0) {
printf("\n");
printfServer("Press again Ctrl^C to exit ");
printf("(whitin %d sec)\n", TIME_TO_RESET);
alarm(TIME_TO_RESET);
} else {
sig = SIGTERM;
}
}
if (sig == SIGALRM) {
printf("<Server> Time to exit (%d sec) expired\n", TIME_TO_RESET);
sigint_count = 2;
}
if (sig == SIGTERM || sig == SIGHUP) {
if (pids[0] > 0) {
printf("\n");
printfServer("Terminating player one");
kill(pids[0], SIGTERM);
}
if (pids[1] > 0){
printf("\n");
printfServer("Terminating player two");
kill(pids[1], SIGTERM);
}
// msgq
if (_MSGQID) {
printf("\n");
printfServer("Deleting msg");
if (msgctl(_MSGQID, IPC_RMID, NULL) == -1) { //TODO: funzione
errExit("msgctl", "sigHandlerServer");
}
}
// sem
if (semid) {
printf("\n");
printfServer("Deleting sem");
if (semctl(semid, 0, IPC_RMID, 0) == -1) {
errExit("semctl", "sigHandlerServer");
}
}
// shm
if (board) {
printf("\n");
printfServer("Detathing shm");
if (shmdt(board) == -1) {
errExit("shmdt", "sigHandlerServer");
}
}
if (shmid){
printf("\n");
printfServer("Deleting shm");
if (shmctl(shmid, IPC_RMID, NULL) == -1) {
errExit("shmctl", "SigHandlerSever");
}
}
printf("\n");
}
exit(0);
}
void setServerSignalHandler() {
sigset_t mySet;
sigfillset(&mySet);
sigdelset(&mySet, SIGINT);
sigdelset(&mySet, SIGTERM);
sigdelset(&mySet, SIGHUP);
sigdelset(&mySet, SIGALRM);
sigprocmask(SIG_SETMASK, &mySet, NULL);
setSignal(SIGINT);
setSignal(SIGTERM);
setSignal(SIGHUP);
setSignal(SIGALRM);
}
void setSignal(int sig) {
if (signal(sig, sigHandlerServer) == SIG_ERR) {
errExit("signal", "f4Server");
}
}