/* * File: ipc.c * Author: Arthur Brandao * * Created on 21 décembre 2018 */ #include #include #include #include "ipc.h" /* --- Extern --- */ ipc_mysh ipc; extern int errno; /* --- Fonctions publiques --- */ boolean setup_ipc(char** envp){ //boolean setup = true; //SHM pour variable environnement if(!create_shm(&ipc.memoire, SHMCODEMEM, MEM_SIZE)){ return false; } //SHM pour gestionnaire variable env if(!create_shm(&ipc.gestionnaire, SHMCODEGEST, sizeof(subdiv))){ return false; } //Si creation alors on remplie les segments printf("Errno %d\n", errno != EEXIST); if(errno != EEXIST){ subdiv* sd = (subdiv*) ipc.gestionnaire.adr; char* mem = (char*) ipc.memoire.adr; ini_subdiv(sd); int i = 0; while(envp[i] != NULL){ add_fdata_subdiv(sd, mem, envp[i]); i++; } } //SHM pour variable globale if(!create_shm(&ipc.global, SHMCODEGLOB, sizeof(int))){ return false; } //Semaphore int ini[] = {1, 1, 1}; if(!create_sem(&ipc.sem, SEMCODE, 3, ini)){ return false; } return true; } boolean end_ipc(){ //Detache les shm if(!unset_shm(&ipc.memoire)){ return false; } if(!unset_shm(&ipc.gestionnaire)){ return false; } if(!unset_shm(&ipc.global)){ return false; } //Tente de supprimer shm if(delete_shm(&ipc.global)){ //Si on est le dernier processus en vie on supprime tous if(!delete_shm(&ipc.memoire)){ return false; } if(!delete_shm(&ipc.gestionnaire)){ return false; } if(!delete_sem(&ipc.sem)){ return false; } } return true; }