Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2019
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.07 KB | None | 0 0
  1. // code source du processus A
  2. #include <sys/types.h>
  3. #include <sys/ipc.h>
  4. #include <sys/shm.h>
  5. #include <math.h>
  6. #include <iostream>
  7. using namespace std;
  8.  
  9. #define CLEF 12345 // je définis une clef au hasard
  10.  
  11. // Je définis une structure quelconque qui comporte un entier et un double.
  12. typedef struct
  13. {
  14. int a;
  15. double b;
  16. }structure_partagee;
  17.  
  18. int main()
  19. {
  20. // variable quelconque qui me sers pour un compteur plus bas...
  21. int i = 0;
  22.  
  23. int mem_ID; // identificateur du segment de mémoire partagée associé à CLEF
  24. void* ptr_mem_partagee; // pointeur sur l'adresse d'attachement du segment de mémoire partagée
  25.  
  26. // J'instancie une structure "structure_partagee" et je l'appelle Data.
  27. structure_partagee Data;
  28.  
  29. if ((mem_ID = shmget(CLEF, sizeof(Data), 0666 | IPC_CREAT)) < 0) // je crée un nouveau segment mémoire de taille "taille de ma structure data" octets, avec des droits d'écriture et de lecture
  30. {
  31. perror("shmget"); // et je m'assure que l'espace mémoire a été correctement créé
  32. exit(1);
  33. }
  34.  
  35. if ((ptr_mem_partagee = shmat(mem_ID, NULL, 0)) == (void*) -1) // J'attache le segment de mémoire partagée identifié par mem_ID au segment de données du processus A dans une zone libre déterminée par le Système d'exploitation
  36. {
  37. perror("shmat"); // et je m'assure que le segment de mémoire a été correctement attaché à mon processus
  38. exit(1);
  39. }
  40.  
  41. // J'alloue des valeurs aux variables de ma structure
  42. Data.a = 2;
  43. Data.b = 2.6544;
  44.  
  45. // je mets à jour ces valeurs en mémoire partagée. ptr_mem_partagee est un pointeur de void. Je le caste pour qu'il devienne un pointeur de "structure_partagee" Et je vais écrire ma structure Data à l'adresse pointée par ce pointeur.
  46.  
  47.  
  48. ((structure_partagee*)ptr_mem_partagee) = Data;
  49.  
  50.  
  51. // je vais modifier en permanence le champ a de ma structure et le mettre à jour, le processus B lira la structure Data.
  52. while(1)
  53. {
  54. Data.a = i;
  55.  
  56.  
  57. ((structure_partagee*)ptr_mem_partagee) = Data;
  58.  
  59. i++;
  60. if(i == 100000000) // je remets à 0 de temps en temps...
  61. i = 0;
  62. }
  63.  
  64. // Une fois sortie de la boucle (bon OK là elle est infine), je détache mon segment mémoire de mon processus, et quand tous les processus en auront fait autant, ce segment mémoire sera détruit.
  65. shmdt(ptr_mem_partagee);
  66.  
  67. // je quitte le programme
  68. return 0;
  69. }
  70.  
  71. // code source du processus B
  72. #include <sys/types.h>
  73. #include <sys/ipc.h>
  74. #include <sys/shm.h>
  75. #include <iostream>
  76. using namespace std;
  77.  
  78. #define CLEF 12345 // !!je définis la même clef que celle du processus A!!
  79.  
  80. // Je crée la même structure que dans le programme A.
  81. // Les noms des variables n'ont rien à voir avec le programme A, seule la structure est importante.
  82. typedef struct
  83. {
  84. int c;
  85. double d;
  86. }structure_partagee_B;
  87.  
  88. int main()
  89. {
  90. // je déclare des variables aptes à recevoir les variables de la structure "structure_partagee" définie dans le processus A
  91. int var1;
  92. double var2;
  93.  
  94. int mem_ID_B; // identificateur du segment de mémoire partagée associé à CLEF (là encore le nom de cette variable n'a rien à voir avec celle du programme A mais son contenu sera évidemment identique)
  95. void* ptr_mem_partagee_B; // adresse d'attachement du segment de mémoire partagée (idem)
  96.  
  97. // J'instancie une structure "structure_partagee_B" et je l'appelle Data_B. Cela me sert uniquement à connaitre la taille de ma structure. Pour bien faire, il faudrait évidemment déclarer cette structure dans un .h qui serait inclu dans A et dans B avec la clef, de façon à garder la cohérence entre les 2 programmes
  98. structure_partagee_B Data_B;
  99.  
  100. if ((mem_ID_B = shmget(CLEF, sizeof(Data_B), 0444)) < 0) // Je cherche le segment mémoire associé à CLEF et je récupère l'identificateur de ce segment mémoire... J'attribue des droits de lecture uniquement
  101. {
  102. perror("shmget"); // et je m'assure que l'espace mémoire a été correctement créé
  103. exit(1);
  104. }
  105. if ((ptr_mem_partagee_B = shmat(mem_ID_B, NULL, 0)) == (void*) -1) // J'attache le segment de mémoire partagée identifié par mem_ID_B au segment de données du processus B dans une zone libre déterminée par le Système d'exploitation
  106. {
  107. perror("shmat"); // et je m'assure que le segment de mémoire a été correctement attaché à mon processus
  108. exit(1);
  109. }
  110.  
  111. // j'affiche le contenu des variables inscrites par A dans la mémoire partagée
  112. while(1) {
  113. // je caste ptr_mem_partagee_B pour qu'il devienne un pointeur de structure_partagee_B et j'affiche le champ c (ou d) de la structure pointée par ((structure_partagee_B*)ptr_mem_partagee_B)
  114. var1 = ((structure_partagee_B*)ptr_mem_partagee_B)->c;
  115. var2 = ((structure_partagee_B*)ptr_mem_partagee_B)->d;
  116. // j'affiche le contenu des champs de la structure l'un à côté de l'autre, et je reviens au début de la ligne.
  117. cout << "data.a = " << var1 ;
  118. cout << " data.b = " << var2 << "\r";
  119. }
  120.  
  121. // Je détruis le segment (le segment n'est pas détruit tant qu'au moins un processus est lié au segment)
  122. shmdt(ptr_mem_partagee_B);
  123.  
  124. // je quitte le programme
  125. return 0;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement