diff --git a/.vscode/settings.json b/.vscode/settings.json index 83b3762..0400d61 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,6 +2,7 @@ "files.associations": { "errexit.h": "c", "structures.h": "c", - "custom_msgq.h": "c" + "custom_msgq.h": "c", + "errno.h": "c" } } \ No newline at end of file diff --git a/inc/custom_shm.h b/inc/custom_shm.h index 0a7d5a2..e250d3c 100644 --- a/inc/custom_shm.h +++ b/inc/custom_shm.h @@ -10,7 +10,8 @@ extern int _SHMID; void setupServerShm(); void setupClientShm(); -int getShmid(); //FIXME: dovrebbero andare nel .c perche non vanno usate da altri file +int getShmidServer(); +int getShmidClient(); //FIXME: dovrebbero andare nel .c perche non vanno usate da altri file tile_t * shmServerAt(); tile_t * shmClientAt(); void shmDt(void *shm_ptr); diff --git a/src/custom_shm.c b/src/custom_shm.c index 50178a6..70b2e30 100644 --- a/src/custom_shm.c +++ b/src/custom_shm.c @@ -2,34 +2,64 @@ #include #include #include +#include +#include +#include +#include #include #include int _SHMID; -int getShmid(); tile_t *shmServerAt(); void setupServerShm() { - _SHMID = getShmid(); + _SHMID = getShmidServer(); _BOARD = shmServerAt(); - - for (int i=0; i < _ROWS * _COLLUMS; i++) { + + for (int i = 0; i < _ROWS * _COLLUMS; i++) { _BOARD[i] = EMPTY; } } void setupClientShm() { printf(PCLIENT "Setting up shm\n"); - _SHMID = getShmid(); + _SHMID = getShmidClient(); _BOARD = shmClientAt(); } -int getShmid() { - int shmid = shmget(ftok(KEYFILE, SHMKEY), _ROWS * _COLLUMS * sizeof(tile_t), IPC_CREAT | S_IRUSR | S_IWUSR); +int getShmidClient() { + shmget(ftok(KEYFILE, SHMKEY), _ROWS * _COLLUMS * sizeof(tile_t), S_IRUSR | S_IWUSR); +} + +int getShmidServer() { + key_t key = ftok(KEYFILE, SHMKEY); + int shmid = shmget(key, _ROWS * _COLLUMS * sizeof(tile_t), IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR); if (shmid == -1) { - errExit("shmget", "getShmid"); + // if errno was set to EEXIST, that means the memory location is alredy allocated + // the server fork and the child remove the memory + if (errno == EEXIST) { + char buf[100]; + sprintf(buf, "the board alredy exit, I'll remove it now\n"); + warningMsg(buf); + + pid_t pid = fork(); + if (pid == 0) { + char str_key[16]; + sprintf(str_key, "0x%08x", key); + printf("%s\n", str_key); + char *vec[] = {"/bin/ipcrm", "-M", str_key, NULL}; + + if ((execv("/bin/ipcrm", vec)) == -1) { + errExit("execv", "getShmidServer"); + } + } + while (wait(0) == -1 && errno == EINTR); + + return getShmidServer(); + } + errExit("shmget", "getShmidServer"); } return shmid; diff --git a/src/server.c b/src/server.c index 44d8a64..c242450 100644 --- a/src/server.c +++ b/src/server.c @@ -50,7 +50,7 @@ void setupServer(int argc, char *argv[]){ input_server_t checkServerInput(int argc, char *argv[]){ if (argc < 5) { - printf("\033[92m\033[39m ./F4Server ROW COL PLAYER1 PLAYER2\n" + printf(PHELP "./F4Server ROW COL PLAYER1 PLAYER2\n" "\t- ROW \t\tnumber of rows\n" "\t- COL \t\tnumber of rows\n" "\t- PLAYER1 \tplayer one token\n"