ipc.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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. #include "variable.h"
  12. /* --- Extern --- */
  13. ipc_mysh ipc;
  14. extern int errno;
  15. /* --- Fonctions publiques --- */
  16. boolean setup_ipc(char** envp){
  17. //boolean setup = true;
  18. //SHM pour variable environnement
  19. if(!create_shm(&ipc.memoire, SHMCODEMEM, MEM_SIZE)){
  20. return false;
  21. }
  22. //SHM pour gestionnaire variable env
  23. if(!create_shm(&ipc.gestionnaire, SHMCODEGEST, sizeof(subdiv))){
  24. return false;
  25. }
  26. //SHM pour variable globale
  27. if(!create_shm(&ipc.global, SHMCODEGLOB, sizeof(int))){
  28. return false;
  29. }
  30. //Si creation alors on remplie les segments
  31. if(errno != EEXIST){
  32. subdiv* sd = (subdiv*) ipc.gestionnaire.adr;
  33. char* mem = (char*) ipc.memoire.adr;
  34. int* nb = (int*) ipc.global.adr;
  35. ini_subdiv(sd);
  36. int i = 0;
  37. while(envp[i] != NULL){
  38. add_fdata_subdiv(sd, mem, envp[i]);
  39. i++;
  40. }
  41. *nb = 0;
  42. }
  43. //Semaphore
  44. int ini[] = {1, 1, 1};
  45. if(!create_sem(&ipc.sem, SEMCODE, 3, ini)){
  46. return false;
  47. }
  48. return true;
  49. }
  50. boolean end_ipc(){
  51. //Detache les shm
  52. if(!unset_shm(&ipc.memoire)){
  53. return false;
  54. }
  55. if(!unset_shm(&ipc.gestionnaire)){
  56. return false;
  57. }
  58. if(!unset_shm(&ipc.global)){
  59. return false;
  60. }
  61. //Tente de supprimer shm
  62. if(delete_shm(&ipc.global)){
  63. //Si on est le dernier processus en vie on supprime tous
  64. if(!delete_shm(&ipc.memoire)){
  65. return false;
  66. }
  67. if(!delete_shm(&ipc.gestionnaire)){
  68. return false;
  69. }
  70. if(!delete_sem(&ipc.sem)){
  71. return false;
  72. }
  73. }
  74. return true;
  75. }
  76. char* parse_shm_var(char* str){
  77. //Recup variable globale
  78. subdiv* sd = (subdiv*) ipc.gestionnaire.adr;
  79. char* mem = (char*) ipc.memoire.adr;
  80. int* buf = (int*) ipc.global.adr;
  81. int nb = *buf;
  82. char* res;
  83. //Regarde si l'ecrivain veut ecrire
  84. P(&ipc.sem, SEMECRIRE);
  85. V(&ipc.sem, SEMECRIRE);
  86. //Modification variable globale
  87. P(&ipc.sem, SEMMUTEX);
  88. nb++;
  89. if(nb == 1){
  90. P(&ipc.sem, SEMWAIT);
  91. }
  92. V(&ipc.sem, SEMMUTEX);
  93. //Lecture
  94. res = parse_var(str, sd, mem);
  95. //Modification variable globale
  96. P(&ipc.sem, SEMMUTEX);
  97. nb--;
  98. if(nb == 0){
  99. V(&ipc.sem, SEMWAIT);
  100. }
  101. V(&ipc.sem, SEMMUTEX);
  102. return res;
  103. }
  104. boolean add_shm_data(char* data){
  105. //Recup variable globale
  106. subdiv* sd = (subdiv*) ipc.gestionnaire.adr;
  107. char* mem = (char*) ipc.memoire.adr;
  108. boolean res;
  109. //Indique que l'on veut ecrire
  110. P(&ipc.sem, SEMECRIRE);
  111. //Attend que les lecteurs finissent
  112. P(&ipc.sem, SEMWAIT);
  113. //Ecriture
  114. res = add_fdata_subdiv(sd, mem, data);
  115. //Libere les semaphores
  116. V(&ipc.sem, SEMWAIT);
  117. V(&ipc.sem, SEMECRIRE);
  118. return res;
  119. }
  120. boolean remove_shm_data(char* key){
  121. //Recup variable globale
  122. subdiv* sd = (subdiv*) ipc.gestionnaire.adr;
  123. char* mem = (char*) ipc.memoire.adr;
  124. boolean res;
  125. //Indique que l'on veut ecrire
  126. P(&ipc.sem, SEMECRIRE);
  127. //Attend que les lecteurs finissent
  128. P(&ipc.sem, SEMWAIT);
  129. //Ecriture
  130. res = remove_data_subdiv(sd, mem, key);
  131. //Libere les semaphores
  132. V(&ipc.sem, SEMWAIT);
  133. V(&ipc.sem, SEMECRIRE);
  134. return res;
  135. }
  136. void show_shm_data(){
  137. //Recup variable globale
  138. subdiv* sd = (subdiv*) ipc.gestionnaire.adr;
  139. char* mem = (char*) ipc.memoire.adr;
  140. //Affiche
  141. show_data_subdiv(sd, mem);
  142. }