Синхронизация и взаимодействие программных потоков в операционной среде реального времени. Дорогов А.Ю. - 59 стр.

UptoLike

Составители: 

59
mq_send() может быть использован вызов write(), он эквивалентен mq_send() со значением
msg_prio=0. При неудаче вызов mq_send() возвращает значение –-1, а при успешном заверше-
ниилюбое положительное значение.
ssize_t mq_receive( mqd_t mqdes, // дескриптор очереди
char* msg_ptr, // указатель к буферу сообщения
size_t msg_len, // размер сообщения
unsigned int* msg_prio ); // приоритет сообщения
Если указатель msg_prio установлен в NULL, значение приоритета принятого сообще-
ния не сохраняется. Вызов read() с дескриптором mqdes аналогичен вызову mq_receive() с ар-
гументом msg_prio= NULL.
Сообщения, подобно файлам, существуют, даже если процессы, их
создавшие, завершены. Если все процессы отсоединены от очереди вызо-
вами mq_unlink() и последний связанный с ней процесс выполняет вызов
mq_close(), то очередь уничтожается со всем ее содержимым. Вызов close()
с дескриптором очереди имеет тот же самый эффект, что и вызов
mq_close(). Для уведомления процессов о поступлении сообщений в оче-
редь может быть использован вызов mq_notify(). Синтаксис этого вызова
представлен в следующем фрагменте.
int mq_notify(mqd_t mqdes, // дескриптор очереди
const struct sigevent* notification ); // уведомление
Тип уведомления notification устанавливается структурой sigevent. Рекомендуются сле-
дующие типы уведомлений: SIGEV_SIGNAL, SIGEV_SIGNAL_CODE, SIGEV_SIGNAL_THREAD,
SIGEV_PULSE, SIGEV_INTR (см. табл. 3.10).
Если аргумент notification не равен NULL, то вызов просит сервер уведомить вызываю-
щий процесс, когда в пустую очередь поступит хотя бы одно сообщение. После пересылки уве-
домление удаляется. Только один процесс на интервале ожидания имеет право зарегистриро-
вать уведомление. Если другой процесс в это время пытается выполнить регистрацию уве-
домления, вызов отклоняется с ошибкой EBUSY в переменной errno. Если некоторый процесс
зарегистрировал уведомление, а другой процесс блокирован по mq_receive(), тогда при посту-
плении сообщения в очередь производится деблокировка ожидающего потока. Уведомление
при этом не передается, поскольку считается, что очередь осталась пустой. Если аргумент
notification равен NULL и вызывается процессом, который ранее зарегистрировал уведомле-
ние, то существующая регистрация удаляется.
4. Дополнение к механизмам синхронизации
4.1. Именованные семафоры
Методы синхронизации потоков, описанные в разд. 1, работают только
в пределах одного узла. Единственным исключением является механизм
именованных семафоров, которые, как и очереди сообщений, поддержива-
ются менеджером mqueue. Именованные семафоры имеют то же самое на-
значение и функции управления, что и обычные семафоры, но отличаются
наличием имени, которое регистрируется менеджером mqueue. Благодаря
имени они становятся известными не только в пределах локального узла,
но и во всей сети. Следующие системные вызовы (табл. 4.1) поддерживают
функциональность именованных семафоров.