Архитектура операционной системы UNIX :: Бах Морис Дж.
Страница:
585 из 715
h›
#include‹sys/msg.h›
#define MSGKEY 75
struct msgform {
long mtype;
char mtext[256];
} msg;
int msgid;
main() {
int i, pid, *pint;
extern cleanup();
for (i = 0; i ‹ 20; i++) signal(i, cleanup);
msgid = msgget(MSGKEY, 0777, IPC_CREAT);
for (;;) {
msgrcv(msgid, &msg, 256, 1, 0);
pint = (int *) msg.mtext;
pid = *pint;
printf("сервер: получил от процесса с pid %d\n", pid);
msg.mtype = pid;
*pint = getpid();
msgsnd(msgid, &msg, sizeof(int), 0);
}
}
cleanup() {
msgctl(msgid, IPC_RMID, 0);
exit();
}
Рисунок 11.8. Обслуживающий процесс (сервер)
Сообщения имеют форму "тип — текст", где текст представляет собой поток байтов. Указание типа дает процессам возможность выбирать сообщения только определенного рода, что в файловой системе не так легко сделать. Таким образом, процессы могут выбирать из очереди сообщения определенного типа в порядке их поступления, причем эта очередность гарантируется ядром. Несмотря на то, что обмен сообщениями может быть реализован на пользовательском уровне средствами файловой системы, представленный вашему вниманию механизм обеспечивает более эффективную организацию передачи данных между процессами.
С помощью системной функции msgctl процесс может запросить информацию о статусе дескриптора сообщения, установить этот статус или удалить дескриптор сообщения из системы.
|< Пред. 583 584 585 586 587 След. >|