non funzia piu neanche ctrl c

This commit is contained in:
Lorenzo Bianchi 2023-05-31 11:52:32 +02:00
parent 3bd1b32212
commit 607acddaf2
7 changed files with 45 additions and 25 deletions

View File

@ -1,16 +1,9 @@
- sistemare include (FARE SOLO ALLA FINE ALTRIMENTI SPRECO DI TEMPO COME LA TUA VITA) - 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 - 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 = ... - messaggio speciale per abbandono
- se le ipcs non si sono chiuse bene non funzia

View File

@ -2,6 +2,7 @@
#define CLIENT_H #define CLIENT_H
extern int ID; extern int ID;
extern pid_t SERVER_PID;
void setupClient(int argc, char *argv[]); void setupClient(int argc, char *argv[]);

View File

@ -18,6 +18,7 @@ extern int _MSGQID;
typedef struct { typedef struct {
long mtype; // type 1 long mtype; // type 1
int player_id; int player_id;
pid_t server_pid;
input_server_t server_in; input_server_t server_in;
} msg_t; } msg_t;

View File

@ -96,7 +96,7 @@ int main(int argc, char *argv[]){
printf(PSERVER "Game ended\n"); 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);
sndGame_end(&game_end); sndGame_end(&game_end);

View File

@ -17,6 +17,7 @@
#include <forza4.h> #include <forza4.h>
int ID; int ID;
pid_t SERVER_PID;
void checkClientinput(int argc, char *argv[]); void checkClientinput(int argc, char *argv[]);

View File

@ -2,6 +2,7 @@
#include <errno.h> #include <errno.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h>
#include <custom_msgq.h> #include <custom_msgq.h>
#include <errExit.h> #include <errExit.h>
@ -39,7 +40,8 @@ void sndId() {
msg_t msg = { msg_t msg = {
.mtype = 1, .mtype = 1,
.server_in = _INPUT_S, .server_in = _INPUT_S,
.player_id = 0 .player_id = 0,
.server_pid = getpid()
}; };
sndMsg(&msg); sndMsg(&msg);
@ -57,6 +59,7 @@ void rcvId() {
setCollums(msg.server_in.collums); setCollums(msg.server_in.collums);
setTokens(msg.server_in.player1Token, msg.server_in.player2Token); setTokens(msg.server_in.player1Token, msg.server_in.player2Token);
ID = msg.player_id; ID = msg.player_id;
SERVER_PID = msg.server_pid;
} }

View File

@ -17,11 +17,11 @@
pid_t _PIDS[2]; pid_t _PIDS[2];
void setSignal(int sig); void setServerSignal(int sig);
void sigIntHandler2(int sig) { void sigIntHandler2(int sig) {
printf("\n"); printf("%d\n", getpid());
kill(getpid(), SIGTERM); exit(0);
} }
void sigHandlerServer(int sig) { void sigHandlerServer(int sig) {
@ -33,9 +33,26 @@ void sigHandlerServer(int sig) {
if (sig == SIGALRM) { if (sig == SIGALRM) {
printf(PSERVER "Time to exit (%d sec) expired\n", TIME_TO_RESET); 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 (sig == SIGTERM || sig == SIGHUP) {
if (_PIDS[0] > 0) { if (_PIDS[0] > 0) {
@ -79,6 +96,7 @@ void sigHandlerServer(int sig) {
exit(0); exit(0);
} }
} }
void setupServerSignalHandler() { void setupServerSignalHandler() {
@ -89,16 +107,18 @@ void setupServerSignalHandler() {
sigdelset(&mySet, SIGTERM); sigdelset(&mySet, SIGTERM);
sigdelset(&mySet, SIGHUP); sigdelset(&mySet, SIGHUP);
sigdelset(&mySet, SIGALRM); sigdelset(&mySet, SIGALRM);
sigdelset(&mySet, SIGUSR1);
sigprocmask(SIG_SETMASK, &mySet, NULL); sigprocmask(SIG_SETMASK, &mySet, NULL);
setSignal(SIGINT); setServerSignal(SIGINT);
setSignal(SIGTERM); setServerSignal(SIGTERM);
setSignal(SIGHUP); setServerSignal(SIGHUP);
setSignal(SIGALRM); setServerSignal(SIGALRM);
setServerSignal(SIGUSR1);
} }
void setSignal(int sig) { void setServerSignal(int sig) {
if (signal(sig, sigHandlerServer) == SIG_ERR) { if (signal(sig, sigHandlerServer) == SIG_ERR) {
errExit("signal", "f4Server"); errExit("signal", "f4Server");
} }
@ -108,9 +128,9 @@ void setSignal(int sig) {
void sigHandlerClient(int sig) { void sigHandlerClient(int sig) {
// Ctrl+C // Ctrl+C
if (sig == SIGINT) { if (sig == SIGINT) {
//TODO: abbandono printf(PCLIENT "Quitting game\n");
game_end_t game = {.mtype = GAME_END, .winner = ID ^ 1};
exit(0); sndGame_end(&game);
} }
// Terminazione e chiusura terminale // Terminazione e chiusura terminale
@ -122,6 +142,7 @@ void sigHandlerClient(int sig) {
errExit("shmdt", "sigHandlerServer"); errExit("shmdt", "sigHandlerServer");
} }
} }
exit(0); exit(0);
} }