Linux: Полное руководство
Шрифт:
Вы также можете добавлять новые поля в эту структуру (но только в своей программе! Код ядра модифицировать не нужно):
He
4056 байтов — это максимальный размер не ваших данных, а всей структуры. включая тип сообщения. Размер типа long равен 4 байтам.
Сами сообщения хранятся ядром в структуре msg, которая также определена в файле msg.h:
Сообщения хранятся в виде односвязного списка. Первый член структуры msg_next — это указатель на следующее сообщение в очереди. Второй член msg_type — это тип сообщения, такой же, как в структуре msg_buf.
Следующий член структуры — это указатель на начало текста сообщения, а последний член msg_ts — размер текста сообщения.
Каждый тип объекта IPC представляется в ядре определенной структурой. Для очередей сообщений это структура msqid_ds (описана в файле
♦ msg_perm
Это структура типа ipc_perm (ipc_perm определена в файле
♦ 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 (ошибка).