Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Для обеспечения возможности обмена сообщениями между процессами механизм очередей поддерживается следующими системными вызовами:
Прототипы перечисленных системных вызовов описаны в файлах
#include <sys/ipc.h>
#include <sys/msg.h>
По системному вызову msgget() в ответ на ключ (key) и набор флагов (полностью аналогичны флагам в системном вызове semget()) ядро либо создает новую очередь сообщений и возвращает пользователю идентификатор созданной очереди, либо находит элемент таблицы очередей сообщений, содержащий указанный ключ, и возвращает соответствующий идентификатор очереди:
int msgqid = msgget(key_t key, int flag).
Для помещения сообщения в очередь служит системный вызов msgsnd():
int msgsnd (int msgqid, void *msg, size_t size, int flag),
где msg - это указатель на структуру длиной size, содержащую определяемый пользователем целочисленный тип сообщения и символьный массив-сообщение.
Структура msg имеет вид:
struct msg {
long mtype; /* тип сообщения */
char mtext[SOMEVALUE]; /* текст сообщения (SOMEVALUE - любое */};
Параметр flag определяет действия ядра при выходе за пределы допустимых размеров внутренней буферной памяти (флаг IPC_NOWAIT со значением, рассмотренным выше).
Условиями успешной постановки сообщения в очередь являются:
Если же оказывается, что новое сообщение невозможно буферизовать в ядре по причине превышения верхнего предела суммарной длины сообщений, находящихся в данной очереди сообщений (флаг IPC_NOWAIT при этом отсутствует), то обратившийся процесс откладывается (усыпляется) до тех пор, пока очередь сообщений не разгрузится процессами, ожидающими получения сообщений.
Для приема сообщения используется системный вызов msgrcv():
int msgrcv (int msgqid, void *msg, size_t size, long msg_type, int flag);
Системный вызов msgctl()
int msgctl (int msgqid, int command, struct msqid_ds *msg_stat)
используется
Дата публикования: 2014-11-29; Прочитано: 250 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!