diff --git a/TODO.txt b/TODO.txt index 3d777e3..7eb1bef 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,16 +1,9 @@ - sistemare include (FARE SOLO ALLA FINE ALTRIMENTI SPRECO DI TEMPO COME LA TUA VITA) -- testare chiusura figli perche i miei terminali si chiudono da soli - -- al momomento i client non sanno ancora le dimensioni del campo (le hanno ricevute ma non settate) - (in realta non so perche funzioni la checkwin al momento) - -- ho messo input del server globale, alcune funzioni non ne usufruiscono ancora (tip shm); - -- define per i semafori invece di usare 1/-1 - - abbandono player -- pulire f4client mettendo var con nomi normali +- ho scoperto solo adesso che c'é set_rows ecc, forse non lho sempre usato facendo invece _ROWS = ... -- ho scoperto solo adesso che c'é set_rows ecc, forse non lho sempre usato facendo invece _ROWS = ... \ No newline at end of file +- messaggio speciale per abbandono + +- se le ipcs non si sono chiuse bene non funzia \ No newline at end of file diff --git a/inc/client.h b/inc/client.h index bdf4a8f..7e811b9 100644 --- a/inc/client.h +++ b/inc/client.h @@ -2,6 +2,7 @@ #define CLIENT_H extern int ID; +extern pid_t SERVER_PID; void setupClient(int argc, char *argv[]); diff --git a/inc/custom_msgq.h b/inc/custom_msgq.h index 655e1d4..a615af5 100644 --- a/inc/custom_msgq.h +++ b/inc/custom_msgq.h @@ -18,6 +18,7 @@ extern int _MSGQID; typedef struct { long mtype; // type 1 int player_id; + pid_t server_pid; input_server_t server_in; } msg_t; diff --git a/src/F4Server.c b/src/F4Server.c index f207b98..0a73527 100644 --- a/src/F4Server.c +++ b/src/F4Server.c @@ -96,7 +96,7 @@ int main(int argc, char *argv[]){ printf(PSERVER "Game ended\n"); } - game_end_t game_end = {.mtype = 4, .winner = result}; + game_end_t game_end = {.mtype = GAME_END, .winner = result}; sndGame_end(&game_end); sndGame_end(&game_end); diff --git a/src/client.c b/src/client.c index d883ea6..1d30aad 100644 --- a/src/client.c +++ b/src/client.c @@ -17,6 +17,7 @@ #include int ID; +pid_t SERVER_PID; void checkClientinput(int argc, char *argv[]); diff --git a/src/custom_msgq.c b/src/custom_msgq.c index 524bae4..c096b8c 100644 --- a/src/custom_msgq.c +++ b/src/custom_msgq.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -39,7 +40,8 @@ void sndId() { msg_t msg = { .mtype = 1, .server_in = _INPUT_S, - .player_id = 0 + .player_id = 0, + .server_pid = getpid() }; sndMsg(&msg); @@ -57,6 +59,7 @@ void rcvId() { setCollums(msg.server_in.collums); setTokens(msg.server_in.player1Token, msg.server_in.player2Token); ID = msg.player_id; + SERVER_PID = msg.server_pid; } diff --git a/src/custom_sig.c b/src/custom_sig.c index 46405f4..7dafb4a 100644 --- a/src/custom_sig.c +++ b/src/custom_sig.c @@ -17,11 +17,11 @@ pid_t _PIDS[2]; -void setSignal(int sig); +void setServerSignal(int sig); void sigIntHandler2(int sig) { - printf("\n"); - kill(getpid(), SIGTERM); + printf("%d\n", getpid()); + exit(0); } void sigHandlerServer(int sig) { @@ -33,9 +33,26 @@ void sigHandlerServer(int sig) { if (sig == SIGALRM) { printf(PSERVER "Time to exit (%d sec) expired\n", TIME_TO_RESET); - signal(SIGINT, sigHandlerServer); + signal(SIGINT, sigIntHandler2); + perror(""); } + 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; + } if (sig == SIGTERM || sig == SIGHUP) { if (_PIDS[0] > 0) { @@ -79,6 +96,7 @@ void sigHandlerServer(int sig) { exit(0); } + } void setupServerSignalHandler() { @@ -89,16 +107,18 @@ void setupServerSignalHandler() { sigdelset(&mySet, SIGTERM); sigdelset(&mySet, SIGHUP); sigdelset(&mySet, SIGALRM); + sigdelset(&mySet, SIGUSR1); sigprocmask(SIG_SETMASK, &mySet, NULL); - setSignal(SIGINT); - setSignal(SIGTERM); - setSignal(SIGHUP); - setSignal(SIGALRM); + setServerSignal(SIGINT); + setServerSignal(SIGTERM); + setServerSignal(SIGHUP); + setServerSignal(SIGALRM); + setServerSignal(SIGUSR1); } -void setSignal(int sig) { +void setServerSignal(int sig) { if (signal(sig, sigHandlerServer) == SIG_ERR) { errExit("signal", "f4Server"); } @@ -108,9 +128,9 @@ void setSignal(int sig) { void sigHandlerClient(int sig) { // Ctrl+C if (sig == SIGINT) { - //TODO: abbandono - - exit(0); + printf(PCLIENT "Quitting game\n"); + game_end_t game = {.mtype = GAME_END, .winner = ID ^ 1}; + sndGame_end(&game); } // Terminazione e chiusura terminale @@ -122,6 +142,7 @@ void sigHandlerClient(int sig) { errExit("shmdt", "sigHandlerServer"); } } + exit(0); }