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

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

Жанры

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 (ошибка).

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

Московское золото или нежная попа комсомолки. Часть 1

Хренов Алексей
1. Летчик Леха
Фантастика:
боевая фантастика
попаданцы
6.33
рейтинг книги
Московское золото или нежная попа комсомолки. Часть 1

Ветер с севера

Щепетнов Евгений Владимирович
5. Нед
Фантастика:
фэнтези
8.83
рейтинг книги
Ветер с севера

Бояръ-Аниме. Газлайтер. Том 35

Володин Григорий Григорьевич
35. История Телепата
Фантастика:
аниме
боевая фантастика
фэнтези
5.00
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 35

Черный Маг Императора 7 (CИ)

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

Император Пограничья 4

Астахов Евгений Евгеньевич
4. Император Пограничья
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Император Пограничья 4

Первый среди равных. Книга III

Бор Жорж
3. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
6.00
рейтинг книги
Первый среди равных. Книга III

Император Пограничья 7

Астахов Евгений Евгеньевич
7. Император Пограничья
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Император Пограничья 7

Кодекс Охотника. Книга XXIV

Винокуров Юрий
24. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXIV

Личник

Валериев Игорь
3. Ермак
Фантастика:
альтернативная история
6.33
рейтинг книги
Личник

Комбинация

Ланцов Михаил Алексеевич
2. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Комбинация

Первый среди равных. Книга X

Бор Жорж
10. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Первый среди равных. Книга X

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

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

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

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

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

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