Механизм передачи сообщений
Механизм передачи сообщений
Системный вызов msgget()
Системный вызов msgget предназначен для выполнения операции доступа к очереди сообщений и, в случае ее успешного завершения, возвращает дескриптор для этой очереди (целое неотрицательное число).
int msgget(key_t key, int msgflg);
Описание системного вызова
Параметр key является ключом для очереди сообщений. Параметр msgflg – флаги – играет роль только при создании новой очереди сообщений и определяет права различных пользователей при доступе к очереди.
Возвращаемое значение
Системный вызов возвращает значение дескриптора System V IPC для очереди сообщений при нормальном завершении и значение -1 при возникновении ошибки.
Системный вызов msgsnd()
Рекомендуемые материалы
Вызов msgsnd() копирует пользовательское сообщение в очередь сообщений.
int msgsnd(int msqid, struct msgbuf *ptr, int length, int flag);
Описание системного вызова
Системный вызов копирует сообщение, расположенное по адресу, на который указывает параметр ptr, в очередь сообщений, заданную дескриптором msqid.
Параметр flag может принимать два значения: 0 и IPC_NOWAIT.
Возвращаемое значение
Системный вызов возвращает значение 0 при нормальном завершении и значение -1 при возникновении ошибки.
Системный вызов msgrcv()
int msgrcv(int msqid, struct msgbuf *ptr, int length, long type, int flag);
Описание системного вызова
Системный вызов msgrcv предназначен для получения сообщения из очереди сообщений, т. е. является реализацией примитива receive.
Параметр msqid является дескриптором для очереди, из которой должно быть получено сообщение.
Параметр length должен содержать максимальную длину полезной части информации.
Параметр flag может принимать значение 0 или быть какой-либо комбинацией флагов IPC_NOWAIT и MSG_NOERROR.
Возвращаемое значение
Системный вызов возвращает при нормальном завершении действительную длину полезной части информации (т. е. информации, расположенной в структуре после типа сообщения), скопированной из очереди сообщений, и значение -1 при возникновении ошибки.
Все прочитанные сообщения по умолчанию удаляются из очереди.
Сервер:
#define MSGKEY 81
struct msgform {
long mtype; //идентификатор сообщения
char text [256]; //данные
}
main ()
{char mas [] = {‘a’,’b’,’c’};
struct msgform msg;
int msgid, *pint;
char *pchar;
msgid = msgget (MSGKEY, 0777 IPC_CREATE);
pint = (int*) msg.txt;
pchar = (char*) msg.text;
msgrcv (msgid, &msg, sizeof (int), 8, 0) //8 – идентификатор
*pchar = mas [*pint];
msg.mtype = 9;
msgsnd (msgid, &msg, sizeof(char),0); // 0 - флаг
}
Клиент:
#define MSGKEY 81
struct msgform {
long mtype; //идентификатор сообщения
char text [256]; //данные
}
main ()
{char mas [] = {‘a’,’b’,’c’};
struct msgform msg;
int msgid, *pint, g;
char *pchar;
msgid = msgget (MSGKEY, 0777);
pint = (int*) msg.txt;
pchar = (char*) msg.text;
scanf (‘%d’, &g);
"Предмет и задачи анатомии. Клетка и ткани" - тут тоже много полезного для Вас.
*pint = g;
msg.mtype = 8;
msgsnd (msgid, &msg, sizeof(int),0); // 0 – флаг
msgrcv (msgid, &msg, sizeof(char), g , 0);
printf (‘номер %d у буквы %c’, g , *pchar);
}