Advertisement
Guest User

Untitled

a guest
Dec 12th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.44 KB | None | 0 0
  1. #include <sys/types.h>
  2. #include <sys/ipc.h>
  3. #include <sys/sem.h>
  4. #include <sys/shm.h>
  5. #include <stdio.h>
  6. #include <errno.h>
  7. #include <stdlib.h>
  8. #include <stdbool.h>
  9. #include <memory.h>
  10.  
  11.  
  12. int main() {
  13. int *count; /* Указатель на разделяемую память */
  14. int shmid; /* IPC дескриптор для области разделяемой памяти */
  15. int semid;
  16. FILE *file;
  17. char pathname[20]; /* Имя файла,
  18. используемое для генерации ключа. Файл с таким
  19. именем должен существовать в текущей директории */
  20. key_t key; /* IPC ключ */
  21.  
  22. char tmp[10];
  23.  
  24. static struct sembuf sop_lock[2] = {
  25. 0, 0, 0, /* ожидать обнуления семафора */
  26. 0, 1, 0 /* затем увеличить значение семафора на 1 */
  27. };
  28.  
  29. static struct sembuf sop_unlock[1] = {
  30. 0, -1, 0 /* обнулить значение семафора */
  31. };
  32.  
  33. while (true) {
  34. printf("Enter \"open\", \"read\" or \"write\":\n");
  35. fflush(stdout);
  36. gets(tmp);
  37. if (strcmp(tmp, "open") == 0) {
  38. printf("Enter key-file name: \n");
  39. scanf("%s", pathname);
  40. file = fopen(pathname, "w+");
  41. fclose(file);
  42.  
  43. /* Генерируем IPC ключ из имени файла в
  44. текущей директории и номера экземпляра области
  45. разделяемой памяти 0 */
  46. if ((key = ftok(pathname, 0)) < 0) {
  47. printf("Can\'t generate key\n");
  48. exit(-1);
  49. }
  50.  
  51.  
  52. if ((semid = semget(key, 1, 0666 | IPC_CREAT | IPC_EXCL)) < 0) {
  53. if (errno = EEXIST) {
  54.  
  55. /* Действительно, ошибка вызвана существованием объекта */
  56.  
  57. if ((semid = semget(key, 1, 0666)) < 0) return (-1); /* Возможно, не хватает системных ресурсов */
  58.  
  59. }
  60. }
  61.  
  62. /* Пытаемся эксклюзивно создать разделяемую память для
  63. сгенерированного ключа, т.е. если для этого ключа она
  64. уже существует, системный вызов вернет отрицательное
  65. значение. Размер памяти определяем как размер массива
  66. из трех целых переменных, права доступа 0666 – чтение
  67. и запись разрешены для всех */
  68. if ((shmid = shmget(key, sizeof(int),
  69. 0666 | IPC_CREAT | IPC_EXCL)) < 0) {
  70. /* В случае ошибки пытаемся определить: возникла ли она
  71. из-за того, что сегмент разделяемой памяти уже существует
  72. или по другой причине */
  73. if (errno != EEXIST) {
  74. /* Если по другой причине – прекращаем работу */
  75. printf("Can\'t create shared memory\n");
  76. exit(-1);
  77. } else {
  78. /* Если из-за того, что разделяемая память уже
  79. существует, то пытаемся получить ее IPC
  80. дескриптор и, в случае удачи, сбрасываем флаг
  81. необходимости инициализации элементов массива */
  82. printf("Shared memory alredy exists. Trying to open...\n");
  83. if ((shmid = shmget(key, sizeof(int), 0)) < 0) {
  84. printf("Can\'t find shared memory\n");
  85. exit(-1);
  86. }
  87. }
  88. }
  89.  
  90. /* Пытаемся отобразить разделяемую память в адресное
  91. пространство текущего процесса. Обратите внимание на то,
  92. что для правильного сравнения мы явно преобразовываем
  93. значение -1 к указателю на целое.*/
  94.  
  95. if ((count = (int *) shmat(shmid, NULL, 0)) == (int *) (-1)) {
  96. printf("Can't attach shared memory\n");
  97. exit(-1);
  98. } else printf("Success!\n");
  99. }
  100. if (strcmp(tmp, "read") == 0) {
  101. semop(semid, &sop_lock[0], 2);
  102. printf("Number of count is: %d \n", *count);
  103. semop(semid, &sop_unlock[0], 1);
  104. }
  105. if (strcmp(tmp, "write") == 0) {
  106. semop(semid, &sop_lock[0], 2);
  107. printf("Enter number to write: ");
  108. scanf("%d", count);
  109. semop(semid, &sop_unlock[0], 1);
  110.  
  111. }
  112. if (strcmp(tmp, "exit") == 0) {
  113. if (shmdt(count) < 0) {
  114. printf("Can't detach shared memory\n");
  115. exit(-1);
  116. }
  117. return 0;
  118. }
  119.  
  120.  
  121. }
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement