10. В каком состоянии проводит большую часть времени функция main из листинга 5.12? Что происходит каждый раз при получении сигнала? Как мы обрабатываем эту ситуацию?
11. Не все реализации поддерживают атрибут PTHREAD_PROCESS_SHARED для взаимных исключений и условных переменных. Переделайте реализацию очередей сообщений из раздела 5.8 так, чтобы использовать семафоры Posix (глава 10) вместо взаимных исключений и условных переменных.
12. Расширьте реализацию очередей сообщений Posix из раздела 5.8 так, чтобы она поддерживала SIGEV_THREAD.
ГЛАВА 6
Очереди сообщений System V
6.1. Введениеы
Каждой очереди сообщений System V сопоставляется свой
Ядро хранит информацию о каждой очереди сообщений в виде структуры, определенной в заголовочном файле sys/msg.h:
struct msqid_ds {
struct ipc_perm msg_perm; /* Разрешения чтения и записи: раздел 3.3 */
struct msg *msg_first; /* указатель на первое сообщение в очереди */
struct msg *msg_last; /* указатель на последнее сообщение в очереди */
msglen_t msg_cbytes; /* размер очереди в байтах */
msgqnum_t msg_qnum; /* количество сообщений в очереди */
msglen_t msg_qbytes; /* максимальный размер очереди в байтах */
pid_t msg_lspid; /* идентификатор (pid) последнего процесса, вызвавшего msgsnd; */
pid_t msg_lrpid; /* pid последнего msgrcv; */
time_t msg_stime; /* время отправки последнего сообщения */
time_t msg_rtime; /* время последнего считывания сообщения */
time_t msg_ctime; /* время последнего вызова msgctl, изменившего одно из полей структуры */
};
ПРИМЕЧАНИЕ
Unix 98 не требует наличия полей msg_first, msg_last и msg_cbytes. Тем не менее они имеются в большинстве существующих реализаций, производных от System V. Естественно, ничто не заставляет реализовывать очередь сообщений через связный список, который неявно предполагается при наличии полей msg_first и msg_last. Эти два указателя обычно указывают на участки памяти, принадлежащие ядру, и практически бесполезны для приложения.
Мы можем изобразить конкретную очередь сообщений, хранимую ядром как связный список, — рис. 6.1. В этой очереди три сообщения длиной 1, 2 и 3 байта с
В этой главе мы рассмотрим функции, используемые для работы с очередями сообщений System V, и реализуем наш пример файлового сервера из раздела 4.2 с использованием очередей сообщений.
Рис. 6.1. Структура очереди system V в ядре
6.2. Функция msgget
Создать новую очередь сообщений или получить доступ к существующей можно с помощью функции msgget:
#include sys/msg.h
int msgget(key_t
/* Возвращает неотрицательный идентификатор в случае успешного завершения, –1 в случае ошибки */
Возвращаемое значение представляет собой целочисленный идентификатор, используемый тремя другими функциями msg для обращения к данной очереди. Идентификатор вычисляется на основе указанного
Флаг