#include #include #include #include #include #include #include #include #include #include #include #include #include #include pid_t _PIDS[2]; void setSignal(int sig); void sigIntHandler2(int sig) { printf("\n"); kill(getpid(), SIGTERM); } void sigHandlerServer(int sig) { if (sig == SIGINT) { printf("\n" PSERVER "Press again Ctrl^C to exit (whitin %d sec)\n", TIME_TO_RESET); signal(SIGINT, sigIntHandler2); alarm(TIME_TO_RESET); } if (sig == SIGALRM) { printf(PSERVER "Time to exit (%d sec) expired\n", TIME_TO_RESET); signal(SIGINT, sigHandlerServer); } if (sig == SIGTERM || sig == SIGHUP) { if (_PIDS[0] > 0) { printf(PSERVER "Terminating player one\n"); kill(_PIDS[0], SIGTERM); } if (_PIDS[1] > 0) { printf(PSERVER "Terminating player two\n"); kill(_PIDS[1], SIGTERM); } // msgq if (_MSGQID) { printf(PSERVER "Deleting msg\n"); if (msgctl(_MSGQID, IPC_RMID, NULL) == -1) { //TODO: funzioni errExit("msgctl", "sigHandlerServer"); } } // sem if (_SEMID) { printf(PSERVER "Deleting sem\n"); if (semctl(_SEMID, 0, IPC_RMID, 0) == -1) { errExit("semctl", "sigHandlerServer"); } } // shm if (_BOARD) { printf(PSERVER "Detathing shm\n"); if (shmdt(_BOARD) == -1) { errExit("shmdt", "sigHandlerServer"); } } if (_SHMID){ printf(PSERVER "Deleting shm\n"); if (shmctl(_SHMID, IPC_RMID, NULL) == -1) { errExit("shmctl", "SigHandlerSever"); } } exit(0); } } void setupServerSignalHandler() { 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"); } } void sigHandlerClient(int sig) { // Ctrl+C if (sig == SIGINT) { //TODO: abbandono sig = SIGTERM; } // Terminazione e chiusura terminale if (sig == SIGTERM || sig == SIGHUP) { // shm if (_BOARD) { printf(PCLIENT "Detathing shm\n"); if (shmdt(_BOARD) == -1) { errExit("shmdt", "sigHandlerServer"); } } exit(0); } // Fine partita if (sig == SIGUSR1) { game_end_t winner; rcvGame_end(&winner); //TODO: kill(getpid(), SIGTERM); } } void setupClientSignalHandler(){ printf(PCLIENT "Setting up signal\n"); sigset_t mySet; sigfillset(&mySet); sigdelset(&mySet, SIGINT); sigdelset(&mySet, SIGTERM); sigdelset(&mySet, SIGHUP); sigdelset(&mySet, SIGUSR1); sigprocmask(SIG_SETMASK, &mySet, NULL); if (signal(SIGINT, sigHandlerClient) == SIG_ERR) { errExit("signal SIGINT", "F4Client"); } if (signal(SIGTERM, sigHandlerClient) == SIG_ERR) { errExit("signal SIGTERM", "F4Client"); } if (signal(SIGHUP, sigHandlerClient) == SIG_ERR) { errExit("signal SIGHUP", "F4Client"); } if (signal(SIGUSR1, sigHandlerClient) == SIG_ERR) { errExit("signal SIGUSR1", "F4Client"); } }