Аллен Питер В.
Шрифт:
♦ msg_ftrst
Указатель на первое сообщение в очереди.
♦ msg_last
Указатель на последнее сообщение в очереди.
♦ msg_stime
Время отправки последнего сообщения из очереди,
♦ msg_rtime
Время последнего изъятия сообщения из очереди.
♦ msg_ctime
Время последнего изменения очереди.
♦ wwait и rwait
Указатели в очередь ожидания ядра, которые используются, когда очередь переполнена и процесс вынужден ждать из-за этого.
♦ msg_cbytes
Суммарный объем всех сообщений в очереди.
♦ msg_qnum
Количество сообщений в очереди.
♦ msg_qbytes
Максимальный размер очереди.
♦ msg_lspid
PID процесса, который послал последнее сообщение в очереди.
♦ msg_lrpid
PID процесса, который получил сообщение из очереди.
26.5.2. Создание очереди сообщений
Для создания очереди сообщений используется системный вызов msgget. Этот же вызов используется для подключения к уже существующей очереди:
Первый аргумент — это ключ, который мы получаем с помощью системного вызова ftok. Второй аргумент — это режим доступа к очереди:
♦ IPC_CREAT — создать очередь, если она не была создана ранее.
♦ IPC_EXCL — если использовать вместе с IPC_CREAT, то в случае, если очередь существует, мы получим ошибку.
Если использовать только IPC_CREAT (без IPC_EXCL), то вызов msgget всегда возвращает идентификатор очереди, даже если очередь уже существует (происходит подключение к очереди). Если использовать IPC_EXCL вместе с IPC_CREAT, также будет создана новая очередь, но если очередь уже существует, подключения не произойдет, а функция msgget возвратит -1 (ошибка).
Вместе с режимом IPC_CREAT можно указывать права доступа к очереди с помощью операции OR:
Если произошла ошибка и msgget вернул -1, то переменная errno устанавливается следующим образом:
♦ EACCESS — у вас нет прав доступа к объекту IPC;
♦ EEXIST — очередь уже существует, создание невозможно, но возможно подключение к очереди;
♦ EIDRM — очередь помечена для удаления;
♦ ENOENT — очередь не существует (в случае подключения);
♦ ENOMEM — не хватает памяти для создания очереди;
♦ ENOSPC — не хватает адресного пространства (то есть превышено максимальное количество очередей).
Следующий код создает очередь сообщений:
26.5.3. Постановка сообщения в очередь
Для постановки сообщения в очередь используется вызов msgsnd:
Первый аргумент — это идентификатор очереди, в которую нужно добавить сообщение. Данный идентификатор мы предварительно получаем с помощью системного вызова msgget. Второй параметр — это указатель на буфер сообщения. Третий аргумент — это длина сообщения без учета типа сообщения (4 байта). Последний аргумент обычно устанавливают равным 0 или IPC_NOWAIT, если вы не хотите, чтобы процесс был блокирован при постановке сообщения в очередь, в случае переполнения очереди. По умолчанию (когда флаг равен 0), если очередь переполнена, ваш процесс будет блокирован до тех пор, пока сообщение не будет поставлено в очередь.
Как обычно, в случае успеха вызов возвращает 0, а если произошла ошибка, то -1. С помощью errno можно анализировать ошибку:
♦ EAGAIN — очередь переполнена, а вы используете флаг IPC_NOWAIT, то есть сообщение будет удалено и вам нужно заново поставить его в очередь (отсюда и название ошибки — AGAIN (опять));
♦ EACCESS — у вас недостаточно прав для записи сообщения в очередь;
♦ EFAULT— неверный адрес буфера msgp (невозможно получить доступ к этому адресу);