Книга: UNIX: взаимодействие процессов

Функция mq_close

Функция mq_close

В листинге 5.20 приведен текст нашей функции mq_close.

Листинг 5.20. Функция mq_close

//my_pxmsg_mmap/mq_close.с
1  #include "unpipc.h"
2  #include "mqueue.h"
3  int
4  mymq_close(mymqd_t mqd)
5  {
6   long msgsize, filesize:
7   struct mymq_hdr *mqhdr;
8   struct mymq_attr *attr;
9   struct mymq_info *mqinfo;
10  mqinfo = mqd;
11  if (mqinfo->mqi_magic != MQI_MAGIC) {
12   errno = EBADF;
13   return(-1);
14  }
15  mqhdr = mqinfo->mqi_hdr;
16  attr = &mqhdr->mqh_attr;
17  if (mymq_notify(mqd, NULL) != 0) /* снятие вызвавшего процесса с регистрации */
18   return(-1);
19  msgsize = MSGSIZE(attr->mq_msgsize);
20  filesize = sizeof(struct mymq_hdr) + (attr->mq_maxmsg *
21   (sizeof(struct mymsg_hdr) + msgsize));
22  if (munmap(mqinfo->mqi_hdr, filesize) == –1)
23   return(-1);
24  mqinfo->mqi_magic = 0; /* на всякий случай */
25  free(mqinfo);
26  return(0);
27 }

Получение указателей на структуры

10-16 Проверяется правильность переданных аргументов, после чего получаются указатели на область, занятую отображенным в память файлом (mqhdr), и атрибуты (в структуре mq_hdr).

Сброс регистрации вызвавшего процесса

17-18 Для сброса регистрации на уведомление вызвавшего процесса мы вызываем mq_notify. Если процесс был зарегистрирован, он будет снят с уведомления, но если нет — ошибка не возвращается.

Отключение отображения файла и освобождение памяти

19-25 Мы вычисляем размер файла для вызова munmap и освобождаем память, используемую структурой mqinfo. На случай, если вызвавший процесс будет продолжать использовать дескриптор очереди сообщений, до того как область памяти будет вновь задействована вызовом malloc, мы устанавливаем значение mq_magiс в ноль, чтобы наши функции для работы с очередью сообщений обнаруживали ошибку.

Обратите внимание, что если процесс завершает работу без вызова mq_close, эти же операции выполняются автоматически: отключается отображение в память, а память освобождается.

Оглавление книги


Генерация: 0.081. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз