Вход/Регистрация
UNIX: взаимодействие процессов
вернуться

Стивенс Уильям Ричард

Шрифт:

4 mymq_getattr(mymqd_t mqd, struct mymq_attr *mqstat)

5 {

6 int n;

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 ((n = pthread_mutex_lock(&mqhdr->mqh_lock)) != 0) {

18 errno = n;

19 return (-1);

20 }

21 mqstat->mq_flags = mqinfo->mqi_flags; /* для каждого open */

22 mqstat->mq_maxmsg = attr->mq_maxmsg; /* оставшиеся три – для очереди */

23 mqstat->mq_msgsize = attr->mq_msgsize;

24 mqstat->mq_curmsgs = attr->mq_curmsgs;

25 pthread_mutex_unlock(&mqhdr->mqh_lock);

26 return(0);

27 }

Блокирование взаимного исключения

17-20 Мы должны заблокировать соответствующее взаимное исключение для работы с очередью, в частности для получения атрибутов, поскольку какой-либо другой поток может в это время их изменить.

Функция mq_setattr

В листинге 5.23 приведен текст функции mq_setattr, которая устанавливает значение атрибутов очереди.

Считывание текущих атрибутов

22-27 Если третий аргумент представляет собой ненулевой указатель, мы возвращаем предыдущее значение атрибутов перед внесением каких-либо изменений.

Изменение mq_flags

28-31 Единственный атрибут, который можно менять с помощью нашей функции, — mq_flags, хранящийся в структуре mq_infо.

Листинг 5.23. Функция mq_setattr

//my_pxmsg_mniap/mq_setattr.с

1 #include "unpipc.h"

2 #include "mqueue.h"

3 int

4 mymq_setattr(mymqd_t mqd. const struct mymq_attr *mqstat,

5 struct mymq attr *omqstat)

6 {

7 int n;

8 struct mymq_hdr *mqhdr;

9 struct mymq_attr *attr;

10 struct mymq_info *mqinfo;

11 mqinfo = mqd;

12 if (mqinfo->mqi_magic != MQI_MAGIC) {

13 errno = EBADF;

14 return(-1);

15 }

16 mqhdr = mqinfo->mqi_hdr;

17 attr = &mqhdr->mqh_attr;

18 if ((n = pthread_mutex_lock(&mqhdr->mqh_lock)) ! = 0) {

19 errno = n;

20 return(-1);

21 }

22 if (omqstat != NULL) {

23 omqstat->mq_flags = mqinfo->mqi_flags; /* исходные атрибуты */

24 omqstat->mq_maxmsg = attr->mq_maxmsg;

25 omqstat->mq_msgsize = attr->mq_msgsize;

26 omqstat->mq_curmsgs = attr->mq_curmsgs; /* текущий статус */

27 }

28 if (mqstat->mq_flags & O_NONBLOCK)

29 mqinfo->mqi flags |= O_NONBLOCK;

30 else

31 mqinfo->ntqi_flags &= ~O_NONBLOCK;

32 pthread_mutex_unlock(&mqhdr->mqh_lock);

33 return(0);

34 }

Функция mq_notify

Функция mq_notify, текст которой приведен в листинге 5.24, позволяет регистрировать процесс на уведомление для текущей очереди и снимать его с регистрации. Информация о зарегистрированных процессах (их идентификаторы) хранится в поле mqh_pid структуры mq_hdr. Только один процесс может быть зарегистрирован на уведомление в любой момент времени. При регистрации процесса мы сохраняем его структуру sigevent в структуре mqh_event.

  • Читать дальше
  • 1
  • ...
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: