Elaborato_SO/src/custom_sig.c

188 lines
4.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/sem.h>
#include <sys/shm.h>
2023-05-21 11:53:23 +02:00
#include <custom_sig.h>
#include <structures.h>
#include <errExit.h>
2023-05-22 10:07:57 +02:00
#include <custom_msgq.h>
2023-05-23 15:16:06 +02:00
#include <custom_sem.h>
2023-05-23 15:41:23 +02:00
#include <custom_shm.h>
#include <forza4.h>
2023-05-31 11:13:23 +02:00
#include <client.h>
2023-05-21 11:53:23 +02:00
2023-05-23 15:47:34 +02:00
pid_t _PIDS[2];
2023-05-21 11:53:23 +02:00
2023-05-31 11:52:32 +02:00
void setServerSignal(int sig);
2023-05-21 11:53:23 +02:00
2023-05-22 10:07:57 +02:00
void sigIntHandler2(int sig) {
2023-05-31 11:52:32 +02:00
printf("%d\n", getpid());
exit(0);
2023-05-21 17:59:02 +02:00
}
2023-05-21 11:53:23 +02:00
void sigHandlerServer(int sig) {
2023-05-21 17:59:02 +02:00
if (sig == SIGINT) {
2023-05-29 13:06:22 +02:00
printf("\n" PSERVER "Press again Ctrl^C to exit (within %d sec)\n", TIME_TO_RESET);
2023-05-22 10:07:57 +02:00
signal(SIGINT, sigIntHandler2);
2023-05-22 09:32:58 +02:00
alarm(TIME_TO_RESET);
2023-05-21 11:53:23 +02:00
}
if (sig == SIGALRM) {
2023-05-25 10:12:14 +02:00
printf(PSERVER "Time to exit (%d sec) expired\n", TIME_TO_RESET);
2023-05-31 11:52:32 +02:00
signal(SIGINT, sigIntHandler2);
perror("");
2023-05-21 11:53:23 +02:00
}
2023-05-31 11:52:32 +02:00
if (sig = SIGUSR1) {
// il giocatore che abbandona mi manda gia il messaggio dicendo che ha vinto l'altro
game_end_t game;
rcvGame_end(&game);
sndGame_end(&game);
sndGame_end(&game);
kill(_PIDS[0], SIGUSR1); //FIXME: fare una funzione per queste robe perche anche gia scritta a fine F4Server
kill(_PIDS[1], SIGUSR1);
_PIDS[0] = 0;
_PIDS[1] = 0;
sig = SIGTERM;
}
2023-05-21 17:59:02 +02:00
2023-05-21 11:53:23 +02:00
if (sig == SIGTERM || sig == SIGHUP) {
if (_PIDS[0] > 0) {
2023-05-22 11:03:36 +02:00
printf(PSERVER "Terminating player one\n");
kill(_PIDS[0], SIGTERM);
2023-05-21 11:53:23 +02:00
}
if (_PIDS[1] > 0) {
2023-05-22 11:03:36 +02:00
printf(PSERVER "Terminating player two\n");
kill(_PIDS[1], SIGTERM);
2023-05-21 11:53:23 +02:00
}
// msgq
if (_MSGQID) {
2023-05-22 11:03:36 +02:00
printf(PSERVER "Deleting msg\n");
2023-05-25 14:28:45 +02:00
if (msgctl(_MSGQID, IPC_RMID, NULL) == -1) { //TODO: funzioni
2023-05-21 11:53:23 +02:00
errExit("msgctl", "sigHandlerServer");
}
}
// sem
if (_SEMID) {
2023-05-22 11:03:36 +02:00
printf(PSERVER "Deleting sem\n");
if (semctl(_SEMID, 0, IPC_RMID, 0) == -1) {
2023-05-21 11:53:23 +02:00
errExit("semctl", "sigHandlerServer");
}
}
// shm
if (_BOARD) {
2023-05-22 11:03:36 +02:00
printf(PSERVER "Detathing shm\n");
if (shmdt(_BOARD) == -1) {
2023-05-21 11:53:23 +02:00
errExit("shmdt", "sigHandlerServer");
}
}
if (_SHMID){
2023-05-22 11:03:36 +02:00
printf(PSERVER "Deleting shm\n");
if (shmctl(_SHMID, IPC_RMID, NULL) == -1) {
2023-05-21 11:53:23 +02:00
errExit("shmctl", "SigHandlerSever");
}
}
2023-05-22 11:03:36 +02:00
2023-05-21 11:59:15 +02:00
exit(0);
}
2023-05-31 11:52:32 +02:00
2023-05-21 11:53:23 +02:00
}
2023-05-22 10:27:46 +02:00
void setupServerSignalHandler() {
2023-05-21 11:53:23 +02:00
sigset_t mySet;
sigfillset(&mySet);
2023-05-22 09:32:58 +02:00
2023-05-21 11:53:23 +02:00
sigdelset(&mySet, SIGINT);
sigdelset(&mySet, SIGTERM);
sigdelset(&mySet, SIGHUP);
sigdelset(&mySet, SIGALRM);
2023-05-31 11:52:32 +02:00
sigdelset(&mySet, SIGUSR1);
2023-05-21 11:53:23 +02:00
sigprocmask(SIG_SETMASK, &mySet, NULL);
2023-05-31 11:52:32 +02:00
setServerSignal(SIGINT);
setServerSignal(SIGTERM);
setServerSignal(SIGHUP);
setServerSignal(SIGALRM);
setServerSignal(SIGUSR1);
2023-05-21 11:53:23 +02:00
}
2023-05-31 11:52:32 +02:00
void setServerSignal(int sig) {
2023-05-21 11:53:23 +02:00
if (signal(sig, sigHandlerServer) == SIG_ERR) {
errExit("signal", "f4Server");
}
2023-05-29 12:35:04 +02:00
}
void sigHandlerClient(int sig) {
// Ctrl+C
if (sig == SIGINT) {
2023-05-31 11:52:32 +02:00
printf(PCLIENT "Quitting game\n");
game_end_t game = {.mtype = GAME_END, .winner = ID ^ 1};
sndGame_end(&game);
2023-05-29 12:35:04 +02:00
}
// Terminazione e chiusura terminale
if (sig == SIGTERM || sig == SIGHUP) {
// shm
if (_BOARD) {
printf(PCLIENT "Detathing shm\n");
if (shmdt(_BOARD) == -1) {
errExit("shmdt", "sigHandlerServer");
}
}
2023-05-31 11:52:32 +02:00
2023-05-29 12:35:04 +02:00
exit(0);
}
// Fine partita
if (sig == SIGUSR1) {
game_end_t winner;
rcvGame_end(&winner);
2023-05-31 11:13:23 +02:00
printBoard();
if (winner.winner == ID) {
printf("YOU WON!!!\n");
} else {
printf("YOU LOST!!!\n");
}
exit(0);
2023-05-29 12:35:04 +02:00
}
}
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");
}
2023-05-21 11:53:23 +02:00
}