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

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

Жанры

Шрифт:

 long mtype;

 char buff[MAXBUFF];

} Message;

Сервер:

#include <sys/ipc.h>

#include <sys/msg.h>

#include "mesg.h"

main {

 /* Структура нашего сообщения (может отличаться от

структуры msgbuf) */

 Message message;

 key_t key;

 int msgid, length, n;

 /*
Получим ключ */

 if ((key = ftok("server", 'A')) < 0) {

printf("Невозможно получить ключ\n");

exit(1);

 }

 /* Тип принимаемых сообщений */

 message.mt_type = 1L;

 /* Создадим очередь сообщений */

 if ((msgid = msgget(key, РЕRМ | IPC_CREAT)) < 0) {

printf("Невозможно создать очередь\n");

exit(1);

 }

 /* Прочитаем сообщение */

 n =

msgrcv(msgid, &message, sizeof(message), message.mtype, 0);

 /* Если сообщение поступило, выведем его содержимое

на терминал */

 if (n > 0) {

if (write(1, message.buff, n) != n) {

printf("Ошибка вывода\n");

exit(1);

}

 } else {

printf("Ошибка чтения сообщения\n");

exit(1);

 }

 /* Удалить очередь поручим клиенту */

 exit(0);

}

Клиент:

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

#include "mesg.h"

main {

 /* Структура нашего сообщения (может отличаться от

структуры msgbuf */

 Message message;

 key_t key;

 int msgid, length;

 /* Тип посылаемого сообщения, может использоваться для

мультиплексирования */

 message.mtype = 1L;

 /* Получим ключ */

 if ((key = ftok("server", 'A')) < 0) {

printf("Невозможно получить ключ\n");

exit(1);

 }

 /* Получим доступ к очереди сообщений, очередь уже

должна быть создана сервером */

 if ((msgid = msgget(key, 0)) < 0) {

printf("Невозможно получить доступ к очереди\n");

exit(1);

 }

 /* Поместим строку в сообщение */

 if ((length = sprintf(message.buff,

"Здравствуй, Мир!\n")) < 0) {

printf("Ошибка копирования в буфер\n");

exit(1);

 } /* Передадим сообщение */

 if (msgsnd(msgid, (void*)&message, length, 0) != 0) {

printf("Ошибка записи сообщения в очередь\n");

exit(1);

 }

 /* Удалим очередь сообщений */

 if (msgctl(msgid, IPC_RMID, 0) < 0) {

printf("Ошибка удаления очереди\n");

exit(1);

 }

 exit(0);

}

Семафоры

Для синхронизации процессов, а точнее, для синхронизации доступа нескольких процессов к разделяемым ресурсам, используются семафоры. Являясь одной из форм IPC, семафоры не предназначены для обмена большими объемами данных, как в случае FIFO или очередей сообщений. Вместо этого, они выполняют функцию, полностью соответствующую своему названию — разрешать или запрещать процессу использование того или иного разделяемого ресурса.

Применение семафоров поясним на простом примере. Допустим, имеется некий разделяемый ресурс (например, файл). Необходимо блокировать доступ к ресурсу для других процессов, когда некий процесс производит операцию над ресурсом (например, записывает в файл). Для этого свяжем с данным ресурсом некую целочисленную величину — счетчик, доступный для всех процессов. Примем, что значение 1 счетчика означает доступность ресурса, 0 — его недоступность. Тогда перед началом работы с ресурсом процесс должен проверить значение счетчика. Если оно равно 0 — ресурс занят и операция недопустима — процессу остается ждать. Если значение счетчика равно 1 — можно работать с ресурсом. Для этого, прежде всего, необходимо заблокировать ресурс, т. е. изменить значение счетчика на 0. После выполнения операции для освобождения ресурса значение счетчика необходимо изменить на 1. В приведенном примере счетчик играет роль семафора.

Для нормальной работы необходимо обеспечить выполнение следующих условий:

1. Значение семафора должно быть доступно различным процессам. Поэтому семафор находится не в адресном пространстве процесса, а в адресном пространстве ядра.

2. Операция проверки и изменения значения семафора должна быть реализована в виде одной атомарной по отношению к другим процессам (т. е. непрерываемой другими процессами) операции. В противном случае возможна ситуация, когда после проверки значения семафора выполнение процесса будет прервано другим процессом, который в свою очередь проверит семафор и изменит его значение. Единственным способом гарантировать атомарность критических участков операций является выполнение этих операций в режиме ядра (см. режимы выполнения процесса).

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

Блуждающие огни 4

Панченко Андрей Алексеевич
4. Блуждающие огни
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Блуждающие огни 4

Я сделаю это сама

Кальк Салма
1. Магический XVIII век
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Я сделаю это сама

Флеш Рояль

Тоцка Тала
Детективы:
триллеры
7.11
рейтинг книги
Флеш Рояль

Боярышня Дуняша

Меллер Юлия Викторовна
1. Боярышня
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Боярышня Дуняша

Газлайтер. Том 8

Володин Григорий
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

Леди для короля. Оборотная сторона короны

Воронцова Александра
3. Королевская охота
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Леди для короля. Оборотная сторона короны

На границе империй. Том 10. Часть 1

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 1

Черный Маг Императора 5

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

Невест так много. Дилогия

Завойчинская Милена
Невест так много
Любовные романы:
любовно-фантастические романы
7.62
рейтинг книги
Невест так много. Дилогия

Идеальный мир для Социопата 3

Сапфир Олег
3. Социопат
Фантастика:
боевая фантастика
6.17
рейтинг книги
Идеальный мир для Социопата 3

Повелитель механического легиона. Том VIII

Лисицин Евгений
8. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том VIII

Наследник павшего дома. Том I

Вайс Александр
1. Расколотый мир
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник павшего дома. Том I

Крещение огнем

Сапковский Анджей
5. Ведьмак
Фантастика:
фэнтези
9.40
рейтинг книги
Крещение огнем

Камень Книга двенадцатая

Минин Станислав
12. Камень
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Камень Книга двенадцатая