ipc.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /*
  2. * File: ipc.c
  3. * Author: Arthur Brandao
  4. *
  5. * Created on 21 décembre 2018
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <errno.h>
  10. #include "ipc.h"
  11. /* --- Extern --- */
  12. ipc_mysh ipc;
  13. extern int errno;
  14. /* --- Fonctions publiques --- */
  15. boolean setup_ipc(char** envp){
  16. //boolean setup = true;
  17. //SHM pour variable environnement
  18. if(!create_shm(&ipc.memoire, SHMCODEMEM, MEM_SIZE)){
  19. return false;
  20. }
  21. //SHM pour gestionnaire variable env
  22. if(!create_shm(&ipc.gestionnaire, SHMCODEGEST, sizeof(subdiv))){
  23. return false;
  24. }
  25. //Si creation alors on remplie les segments
  26. printf("Errno %d\n", errno != EEXIST);
  27. if(errno != EEXIST){
  28. subdiv* sd = (subdiv*) ipc.gestionnaire.adr;
  29. char* mem = (char*) ipc.memoire.adr;
  30. ini_subdiv(sd);
  31. int i = 0;
  32. while(envp[i] != NULL){
  33. add_fdata_subdiv(sd, mem, envp[i]);
  34. i++;
  35. }
  36. }
  37. //SHM pour variable globale
  38. if(!create_shm(&ipc.global, SHMCODEGLOB, sizeof(int))){
  39. return false;
  40. }
  41. //Semaphore
  42. int ini[] = {1, 1, 1};
  43. if(!create_sem(&ipc.sem, SEMCODE, 3, ini)){
  44. return false;
  45. }
  46. return true;
  47. }
  48. boolean end_ipc(){
  49. //Detache les shm
  50. if(!unset_shm(&ipc.memoire)){
  51. return false;
  52. }
  53. if(!unset_shm(&ipc.gestionnaire)){
  54. return false;
  55. }
  56. if(!unset_shm(&ipc.global)){
  57. return false;
  58. }
  59. //Tente de supprimer shm
  60. if(delete_shm(&ipc.global)){
  61. //Si on est le dernier processus en vie on supprime tous
  62. if(!delete_shm(&ipc.memoire)){
  63. return false;
  64. }
  65. if(!delete_shm(&ipc.gestionnaire)){
  66. return false;
  67. }
  68. if(!delete_sem(&ipc.sem)){
  69. return false;
  70. }
  71. }
  72. return true;
  73. }