Чтение онлайн

на главную - закладки

Жанры

Linux: Полное руководство

Аллен Питер В.

Шрифт:

struct my_buf {

 long mtype;

 char mtext[128];

}

Вы также можете добавлять новые поля в эту структуру (но только в своей программе! Код ядра модифицировать не нужно):

struct my_buf {

 long mtype;

 char mtext[128];

 char info[50];

 int status;

}

He

бойтесь создавать свои структуры: ядру все равно, с какими данными работать, вам нужно учитывать только максимальный размер сообщения, который определен в файле /usr/src/linux/include/linux/msg.h:

#define MSGMAX 4056

4056 байтов — это максимальный размер не ваших данных, а всей структуры. включая тип сообщения. Размер типа long равен 4 байтам.

Сами сообщения хранятся ядром в структуре msg, которая также определена в файле msg.h:

struct msg {

 struct msg *msg_next; /* указатель на след. сообщение

в очереди */

 long msg_type; /* тип сообщения */

 char *msg_spot; /* адрес самого сообщения (текста) */

 short msg_ts; /* размер сообщения (текста) */

};

Сообщения хранятся в виде односвязного списка. Первый член структуры msg_next — это указатель на следующее сообщение в очереди. Второй член msg_type — это тип сообщения, такой же, как в структуре msg_buf.

Следующий член структуры — это указатель на начало текста сообщения, а последний член msg_ts — размер текста сообщения.

Каждый тип объекта IPC представляется в ядре определенной структурой. Для очередей сообщений это структура msqid_ds (описана в файле

/usr/src/linux/include/linux/msg.h
).

struct msqid_ds {

 struct ipc_perm msg_perm; /* информация о правах

доступа */

 struct msg *msg_first; /* указатель на первое сообщение

в очереди */

 struct msg *msg_last; /* указатель на последнее сообщение

в очереди*/

 time_t msg_stime; /* время последнего вызова msgsnd */

 time_t msg_rtime; /* время последнего вызова msgrcv */

 time_t msg_ctime; /* время последнего изменения */

 struct wait_queue *wwait;

 struct wait_queue *rwait;

 ushort msg_cbytes;

 ushort msg_qnum;

 ushort msg_qbytes; /* максимальное число байтов на очередь */

 ushort msg_lspid; /* pid
последнего испустившего msgsnd */

 ushort msg_lrpid; /* последний полученный pid */

};

♦ msg_perm

Это структура типа ipc_perm (ipc_perm определена в файле

linux/ipc.h
). Данная структура содержит информацию о владельце и правах доступа:

struct ipc_perm {

 key_t key;

 ushort uid; /* uid и gid владельца */

 ushort gid;

 ushort cuid; /* uid и gid создателя */

 ushort cgid;

 ushort mode; /* режим доступа */

 ushort seq; /* системное поле. Вас оно не касается. */

};

♦ 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. Этот же вызов используется для подключения к уже существующей очереди:

int msgget(key_t key, int msgflg);

Первый аргумент — это ключ, который мы получаем с помощью системного вызова ftok. Второй аргумент — это режим доступа к очереди:

♦ IPC_CREAT — создать очередь, если она не была создана ранее.

♦ IPC_EXCL — если использовать вместе с IPC_CREAT, то в случае, если очередь существует, мы получим ошибку.

Если использовать только IPC_CREAT (без IPC_EXCL), то вызов msgget всегда возвращает идентификатор очереди, даже если очередь уже существует (происходит подключение к очереди). Если использовать IPC_EXCL вместе с IPC_CREAT, также будет создана новая очередь, но если очередь уже существует, подключения не произойдет, а функция msgget возвратит -1 (ошибка).

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

Гримуар темного лорда III

Грехов Тимофей
3. Гримуар темного лорда
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Гримуар темного лорда III

Последний Паладин. Том 10

Саваровский Роман
10. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 10

Телохранитель Цесаревны

Зот Бакалавр
5. Герой Империи
Фантастика:
фэнтези
боевая фантастика
5.25
рейтинг книги
Телохранитель Цесаревны

Ефрейтор. Назад в СССР. Книга 2

Гаусс Максим
2. Второй шанс
Фантастика:
попаданцы
альтернативная история
7.00
рейтинг книги
Ефрейтор. Назад в СССР. Книга 2

Черный Маг Императора 14

Герда Александр
14. Черный маг императора
Фантастика:
аниме
сказочная фантастика
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Черный Маг Императора 14

Идеальный мир для Лекаря 16

Сапфир Олег
16. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 16

Семь Нагибов на версту

Машуков Тимур
1. Семь, загибов на версту
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Семь Нагибов на версту

Черный рынок

Вайс Александр
6. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Черный рынок

Двойник Короля 10

Скабер Артемий
10. Двойник Короля
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Двойник Короля 10

Надуй щеки! Том 5

Вишневский Сергей Викторович
5. Чеболь за партой
Фантастика:
попаданцы
дорама
7.50
рейтинг книги
Надуй щеки! Том 5

Изгой Проклятого Клана. Том 4

Пламенев Владимир
4. Изгой
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Изгой Проклятого Клана. Том 4

Второгодка. Книга 5. Презренный металл

Ромов Дмитрий
5. Второгодка
Фантастика:
городское фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Второгодка. Книга 5. Презренный металл

Вперед в прошлое 11

Ратманов Денис
11. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 11

Тринадцатый VIII

NikL
8. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый VIII