Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
All os.doc
Скачиваний:
28
Добавлен:
06.12.2018
Размер:
2.84 Mб
Скачать
      1. Очередь сообщений. Модель «клиент-сервер»

server

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

#include <string.h>

int main(int argc, char **argv)

{

struct {

long mestype;

char mes [100];

} messageto;

struct {

long mestype;

long mes;

} messagefrom;

key_t key;

int mesid;

key = ftok("example",'r');

mesid = msgget (key, 0666 | IPC_CREAT);

while(1)

{

if (msgrcv(mesid, &messagefrom, sizeof(messagefrom), 1, 0) <= 0) continue;

messageto.mestype = messagefrom.mes;

strcpy( messageto.mes, "Message for client");

msgsnd (mesid, &messageto, sizeof(messageto), 0);

}

msgctl (mesid, IPC_RMID, 0);

return 0;

}

client

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

#include <unistd.h>

#include <stdio.h>

int main(int argc, char **argv)

{

struct {

long mestype; /*описание структуры сообщения*/

long mes;

} messageto;

struct {

long mestype; /*описание структуры сообшения*/

char mes[100];

} messagefrom;

key_t key;

int mesid;

long pid = getpid();

key = ftok("example", 'r');

mesid = msgget(key, 0); /*присоединение к очереди сообщений*/

messageto.mestype = 1;

messageto.mes = pid;

msgsnd (mesid, &messageto, sizeof(messageto), 0); /* отправка */

while ( msgrcv (mesid, &messagefrom, sizeof(messagefrom), pid, 0) <= 0);

/*прием сообщения */

printf("%s\n", messagefrom.mes);

return 0;

}

Билет 41 Разделяемая память

Рис. 11 Разделяемая память

Механизм разделяемой памяти позволяет нескольким процессам получить отображение некоторых страниц из своей виртуальной памяти на общую область физической памяти. Благодаря этому, данные, находящиеся в этой области памяти, будут доступны для чтения и модификации всем процессам, подключившимся к данной области памяти.

Процесс, подключившийся к разделяемой памяти, может затем получить указатель на некоторый адрес в своем виртуальном адресном пространстве, соответствующий данной области разделяемой памяти. После этого он может работать с этой областью памяти аналогично тому, как если бы она была выделена динамически (например, путем обращения к malloc()), однако, как уже говорилось, сама по себе разделяемая область памяти не уничтожается автоматически даже после того, как процесс, создавший или использовавший ее, перестанет с ней работать.

Рассмотрим набор системных вызовов для работы с разделяемой памятью.

Создание общей памяти.

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

int shmget (key_t key, int size, int shmemflg)

Аргументы этого вызова: key - ключ для доступа к разделяемой памяти; size задает размер области памяти, к которой процесс желает получить доступ. Если в результате вызова shmget() будет создана новая область разделяемой памяти, то ее размер будет соответствовать значению size. Если же процесс подключается к существующей области разделяемой памяти, то значение size должно быть не более ее размера, иначе вызов вернет –1. Заметим, что если процесс при подключении к существующей области разделяемой памяти указал в аргументе size значение, меньшее ее фактического размера, то впоследствии он сможет получить доступ только к первым size байтам этой области.

Отметим, что в заголовочном файле <sys/shm.h> определены константы SHMMIN и SHMMAX, задающий минимально возможный и максимально возможный размер области разделяемой памяти. Если процесс пытается создать область разделяемой памяти, размер которой не удовлетворяет этим границам, системный вызов shmget() окончится неудачей.

Третий параметр определяет флаги, управляющие поведением вызова. Подробнее алгоритм создания/подключения разделяемого ресурса был описан выше.

В случае успешного завершения вызов возвращает положительное число – дескриптор области памяти, в случае неудачи - -1.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]