Функция 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, эти же операции выполняются автоматически: отключается отображение в память, а память освобождается.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
5.2. Функции mq_open, mq_close, mq_unlink
5.2. Функции mq_open, mq_close, mq_unlink Функция mq_open создает новую очередь сообщений либо открывает существующую:#include <mqueue.h>mqd_t mq_open(const char *name, int oflag, …/* mode_t mode, struct mq_attr *attr*/ );/* Возвращает дескриптор очереди в случае успешного завершения; –1 – в противном случае. */Требования к
Функция mq_open
Функция mq_open В листинге 5.17 приведен текст первой части функции mq_open, создающей новую очередь сообщений или открывающей существующую.Листинг 5.17. Функция mq_open: первая часть//my_pxmsg._mmap/mq_open. с1 #include "unpipc.h"2 #include "mqueue.h"3 #include <stdarg.h>4 #define MAX_TRIES 105 struct mymq_attr defattr =6 { 0, 128, 1024, 0
Функция mq_unlink
Функция mq_unlink Текст функции mqunlink приведен в листинге 5.21. Она удаляет файл, связанный с очередью сообщений, вызывая функцию unlink.Листинг 5.21. Функция mq_unlink//my_pxmsg_mmap/mq_unlink.с1 #include "unpipc.h"2 #include "mqueue.h"3 int4 mymq_unlink(const char *pathname)5 {6 if (unlink(pathname) == –1)7 return(-1);8 return(0);9
Функция mq_receive
Функция mq_receive В листинге 5.27 приведен текст первой половины функции mq_receive, которая получает необходимые указатели, блокирует взаимное исключение и проверяет объем буфера вызвавшего процесса, который должен быть достаточным для помещения туда сообщения максимально
Функция sem_open
Функция sem_open В листинге 10.37 приведен текст первой половины функции sem_open, которая создает новый семафор или открывает существующий.Листинг 10.37. Функция sem_open: первая часть//my_pxsem_svsem/sem_open. с1 #include "unpipc.h"2 #include "semaphore.h"3 #include <stdarg.h> /* для списков аргументов переменной длины
Функция SUM
Функция SUM Ваши возможности в подведении итогов не ограничены простым подсчетом записей. Используя функцию SUM, можно генерировать итоговые результаты для всех возвращаемых записей по любым числовым полям. Например, для создания запроса, который генерирует итоги по
Функция uni()
Функция uni() Поиск/замена символа по его юникодному номеру также может быть сделана при помощи функции uni().Пример функции uni(): Boouni(107,32)Designer найдет слово Book
Функция uni()
Функция uni() Поиск/замена символа по его юникодному номеру также может быть сделана при помощи функции uni().Пример функции uni(): Boouni(107,32)Designer найдет слово Book
Хэш-функция.
Хэш-функция. Еще одно важное преимущество использования PGP состоит в том, что PGP применяет так называемую «хэш-функцию», которая действует таким образом, что в том случае какого-либо изменения информации, пусть даже на один бит, результат «хэш-функции» будет совершенно
Функция uni()
Функция uni() Поиск/замена символа по его юникодному номеру также может быть сделана при помощи функции uni().Пример функции uni(): Boouni(107,32)Designer найдет слово Book
Хэш-функция
Хэш-функция Однако описанная выше схема имеет ряд существенных недостатков. Она крайне медлительна и производит слишком большой объём данных — по меньшей мере вдвое больше объёма исходной информации. Улучшением такой схемы становится введение в процесс преобразования