sem.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #define _XOPEN_SOURCE
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <sys/stat.h> /* Constante option */
  5. #include <errno.h>
  6. #include "error.h"
  7. #include "sem.h"
  8. boolean create_sem(semaphore* sem, int code, int nb) {
  9. int id;
  10. extern int errno;
  11. /* Création du tableau */
  12. key_t key = ftok(SEMKEYPATH, code);
  13. id = semget(key, nb, S_IRUSR | S_IWUSR | IPC_CREAT | IPC_EXCL);
  14. if (id == ERR) {
  15. /* Si le tableau existe deja */
  16. if (errno == EEXIST) {
  17. adderror("Le tableau de sémaphore existe deja");
  18. return false;
  19. }
  20. /* Sinon erreur */
  21. addperror("Impossible de créer le tableau de sémaphore");
  22. return false;
  23. }
  24. /* Paramétrage de la structure */
  25. sem->id = id;
  26. sem->key = key;
  27. sem->nb = nb;
  28. /* Retour */
  29. return true;
  30. }
  31. boolean get_sem(semaphore* sem, int code) {
  32. int id;
  33. struct semid_ds sem_buf;
  34. /* Création du tableau */
  35. key_t key = ftok(SEMKEYPATH, code);
  36. id = semget(key, 0, S_IRUSR | S_IWUSR);
  37. if (id == ERR) {
  38. /* Sinon erreur */
  39. addperror("Impossible de récupèrer le tableau de sémaphore");
  40. return false;
  41. }
  42. /* Récupération du nombre de semaphore */
  43. if (semctl(id, 0, IPC_STAT, &sem_buf) == ERR) {
  44. addperror("Impossible de récupèrer les informations du tableau de sémaphore");
  45. return false;
  46. }
  47. /* Paramétrage de la structure */
  48. sem->id = id;
  49. sem->key = key;
  50. sem->nb = sem_buf.sem_nsems;
  51. /* Retour */
  52. return true;
  53. }
  54. boolean ini_sem(semaphore* sem, int* iniVal) {
  55. /* Initialisation des valeurs */
  56. if (semctl(sem->id, 0, SETALL, iniVal) == ERR) {
  57. addperror("Impossible d'initialiser le tableau de semaphore");
  58. return false;
  59. }
  60. /* Retour */
  61. return true;
  62. }
  63. boolean P(semaphore* sem, int num) {
  64. struct sembuf action;
  65. /* Le num valide */
  66. if (num < 0 || num > (sem->nb - 1)) {
  67. adderror("Index tableau semaphore invalide");
  68. return false;
  69. }
  70. /* Parametre sembuf */
  71. action.sem_num = num;
  72. action.sem_op = -1;
  73. /* Puis je */
  74. if (semop(sem->id, &action, 1) == ERR) {
  75. addperror("Impossible d'effectuer P");
  76. return false;
  77. }
  78. return true;
  79. }
  80. boolean V(semaphore* sem, int num) {
  81. struct sembuf action;
  82. /* Le num valide */
  83. if (num < 0 || num > (sem->nb - 1)) {
  84. adderror("Index tableau semaphore invalide");
  85. return false;
  86. }
  87. /* Parametre sembuf */
  88. action.sem_num = num;
  89. action.sem_op = 1;
  90. /* Vas y */
  91. if (semop(sem->id, &action, 1) == ERR) {
  92. addperror("Impossible d'effectuer V");
  93. return false;
  94. }
  95. return true;
  96. }
  97. boolean delete_sem(semaphore* sem) {
  98. /* Suppr */
  99. if (semctl(sem->id, 0, IPC_RMID) == ERR) {
  100. addperror("Impossible de supprimer le tableau de semaphore");
  101. return false;
  102. }
  103. /* Reset struct */
  104. sem->id = 0;
  105. sem->key = 0;
  106. sem->nb = 0;
  107. return true;
  108. }