Главная страница Взаимодействие нетривиальных процессов должать использовать дескриптор очереди сообщений, до того как область памяти будет вновь задействована вызовом mal 1 ос, мы устанавливаем значение niq magic в ноль, чтобы наши функции для работы с очередью сообщений обнаруживали ошибку. Обратите внимание, что если процесс завершает работу без вызова mq close, эти же операции выполняются автоматически: отключается отображение в память, а память освобождается. Функция mq unlink Текст функции mqunl i nk приведей в листинге 5.21. Она удаляет файл, связанный с очередью сообщений, вызывая функцию unl ink. Листинг 5.21. Функция mq unlink niy pxmsg nirap/mq unl i nk. с 1 #inclucle unpipc.h 2 #inclucle mqueue.h 3 int 4 mymq unlink(const char *pathname) 6 if (unlink(pathname) = -1) 7 return(-l); 8 return(O); Функция mq getattr в листинге 5.22 приведен текст функции mqgetattr, которая возвращает текущее значение атрибутов очереди. Листинг 5.22. Функция mq getattr rny pxmsg mmap/mq getattr. с 1 #inclucle unpipc.h 2 #inclucle mqueue.h 3 int 4 rnymq getattr(mymqcl t mqd. struct mymq attr *mqstat) 6 int n: 7 struct rnymq hdr *mqhdr: 8 struct mymq attr *attr: 9 struct rnymqjnfo *mqinfo: 10 mqinfo = mqd; 11 if (mqinfo->mqi magic != MQI MAGIC) { 12 errno = EBADF: 13 return(-l); 14 } 15 mqhdr = mq1nfo->mqi hdr; 16 attr = &mqhdr->mqh attr; 17 if ( (n - pthread mutex lock(&mqhdr->mqh lock)) != 0) { 18 errno = n; 19 return(-l); продолжение Листинг 5.22 (продолжение) 20 } 21 mqstat->mq flags = mqinfo->mqi flags; /* для каждого open */ 22 mqstat->mq niaxnisg = attr->mq niaxnisg: /* оставшиеся три - для очереди */ 23 mqstat->mq nisgsize = attr->mq nisgslze: 24 mqstat->niq cunnsgs = attr->mq curnisgs; 25 pthreacl niutex unlock(&mqhclr->rnqhJock): 26 return(O): 27 } Блокирование взаимного исключения 17-20 Мы должны заблокировать соответствующее взаимное исключение для работы с очередью, в частности для получения атрибутов, поскольку какой-либо другой поток может в это время их изменить. Функция mq setattr в листинге 5.23 приведен текст функции mqsetattr, которая устанавливает значение атрибутов очереди. Считывание текущих атрибутов 22-27 Если третий аргумент представляет собой ненулевой указатель, мы возвращаем предыдущее значение атрибутов перед внесением каких-либо изменений. Изменение nriq f lags 28-31 Единственный атрибут, который можно менять с помощью нашей функции, - mq f 1 ags, хранящийся в структуре mq info. Листинг 5.23. Функция mq setattr iny pxnisg mmap/mq setattr. с 1 #inc1ucle unpipc.h 2 #inclucle mqueue.h mymq setattr(mymqcl t mqd, const struct mymq attr *mqstat. struct mymq attr *omqstat) int n; 8 struct myraq hdr *mqhdr; 9 struct inymq attr *attr; 10 struct itiymqjnfo *mqinfo; 11 mqinfo = mqd: 12 if (mqinfo->mqi magic != MQI IGIC) { 13 errno = EBADF: 14 return(-l); 15 } 16 mqhdr = mqinfo->mq1 hdr: 17 attr = &mqhdr->mqh attr: 18 If ( (n = pthread mutexJock(&mqhdr->mqhJock)) != 0) 19 errno = n; 20 return(-l); 21 } 22 lf (omqstat != NULL) { 23 omqstat->mq flags = niqinfo->iTiqi flags: /* исходные атрибуты */ 24 omqstat->niq niaxnisg = attr->mq maxmsg; 25 omqstat->mq msgsTze = attr->mq msgsize; 26 omqstat->mq curmsgs = attr->mq curmsgs; /* текущий статус */ 27 } 28 if (mqstat->mq flags & 0 NONBLOCK) 29 mqinfo->mqi flags 1= OJONBLOCK; 30 else 31 mqinfo->mqi flags &= -OJONBLOCK: 32 pthreacl mutex unl ock (&mqhclr ->mqh l ock); 33 return(O); 34 } Функция mq notify Функция mqjoti fy, текст которой приведен в листинге 5,24, позволяет регистрировать процесс на уведомление для текущей очереди и снимать его с регистрации. Информация о зарегистрированных процессах (их идентификаторы) хранится в поле niqh pi d структуры mqjdr. Только один процесс может быть зарегистрирован на уведомление в любой момент времени. При регистрации процесса мы сохраняем его структуру sigevent в структуре mqh event. Листинг 5.24. Функция mq notify myj)xmsg mmap/mq notify.c 1 #inclucle unpipc.h 2 #inclucle mqueue.h 3 int 4 mymq notify(mymqcl t mqd, const struct sigevent *notification) 6 int n; 7 pid t pid; 8 struct mymq hdr *mqhdr; 9 struct mymq info *mqinfo; 10 mqinfo = mqd: 11 if (mqinfo->mqi magic ! MQIJAGIC) { 12 errno = EBADF; 13 return(-l); 14 } 15 mqhdr = mqinfo->mqi Jdr; 16 if ( (n = pthread mutexJock(&mqhdr->mqh lock)) != 0) { 17 errno = n; 18 return(-l); 19 } 20 pid = getpidO; 21 if (notification =- NULL) { 22 if (mqhdr->mqh pid == pid) {
|
© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |