Жанры книг
Мы в соц.сетях
ParaKnig📚 » Компьютеры и Интернет » Интернет » Операционная система UNIX - Робачевский Андрей Михайлович
<< На главную

Операционная система UNIX - Робачевский Андрей Михайлович

Читать онлайн Операционная система UNIX - Робачевский Андрей Михайлович

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 80 81 82 83 84 85 86 87 88 ... 156
Перейти на страницу:

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

shmem.h:

#define MAXBUFF 80

#define PERM 0666

/* Структура данных в разделяемой памяти */

typedef struct mem_msg {

 int segment;

 char buff[MAXBUFF];

} Message;

/* Ожидание начала выполнения клиента */

static struct sembuf proc_wait[1] = { 1, -1, 0 };

/* Уведомление сервера о том, что клиент начал работу */

static struct sembuf proc_start[1] = {

 1, 1, 0

};

/* Блокирование разделяемой памяти */

static struct sembuf mem_lock[2] = {

 0, 0, 0,

 0, 1, 0

};

/* Освобождение ресурса */

static struct sembuf mem_unlock[1] = {

 0, -1, 0

};

Сервер:

#include &lt;sys/types.h&gt;

#include &lt;sys/ipc.h&gt;

#include &lt;sys/sem.h&gt;

#include &lt;sys/shm.h&gt;

#include &quot;shmem.h&quot;

main() {

 Message* msgptr;

 key_t key;

 int shmid, semid;

 /* Получим ключ, Один и тот же ключ можно использовать как

    для семафора, так и для разделяемой памяти */

 if ((key = ftok(&quot;server&quot;, 'A')) &lt; 0) {

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

  exit(1);

 }

 /* Создадим область разделяемой памяти */

 if ((shmid = shmget(key, sizeof(Message),

  PERM | IPC_CREAT)) &lt; 0) {

  printf(&quot;Невозможно создать областьn&quot;);

  exit(1);

 }

 /* Присоединим ее */

 if ((msgptr = (Message*)shmat(shmid, 0, 0)) &lt; 0) {

  printf(&quot;Ошибка присоединенияn&quot;);

  exit(1);

 }

 /* Создадим группу из двух семафоров:

    Первый семафор - для синхронизации работы

    с разделяемой памятью. Второй семафор -

    для синхронизации выполнения процессов */

 if ((semid = semget(key, 2, PERM | IPC_CREAT)) &lt; 0) {

  printf(&quot;Невозможно создать семафорn&quot;);

  exit(1);

 }

 /* Ждем, пока клиент начнет работу и заблокирует разделяемую память */

 if (semop(semid, &amp;proc_wait[0], 1) &lt; 0) {

  printf(&quot;Невозможно выполнить операцииn&quot;);

  exit(1);

 }

 /* Ждем, пока клиент закончит запись в разделяемую память

    и освободит ее. После этого заблокируем ее */

 if (semop(semid, &amp;mem_lock[0], 2) &lt; 0) {

  printf(&quot;Невозможно выполнить операциюn&quot;);

  exit(1);

 }

 /* Выведем сообщение на терминал */

 printf(%s, msgptr-&gt;buff);

 /* Освободим разделяемую память */

 if (semop(semid, &amp;mem_unlock[0], 1) &lt; 0 {

  printf(&quot;Невозможно выполнить операциюn&quot;);

  exit(1);

 }

 /* Отключимся от области */

 if (shmdt(msgptr) &lt; 0) {

  printf(&quot;Ошибка отключенияn&quot;);

  exit(1);

 }

 /* Всю остальную работу по удалению объектов сделает клиент */

 exit(0);

}

1 ... 80 81 82 83 84 85 86 87 88 ... 156
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу Операционная система UNIX - Робачевский Андрей Михайлович бесплатно.
Комментарии
Открыть боковую панель
Комментарии
Лариса
Лариса 11.03.2026 - 20:17
Странно,здесь имя девочки Аграфена,а на других сайтах я прослушала три книги этого цикла с именем Дарвина.Зачем менять имя и путать читателей? Опечатка- не Дарвина,  а  Дарина.
Григорий
Григорий 09.04.2025 - 22:24
Лучшая книга всех времен
Женя
Женя 02.04.2025 - 16:08
Любимая книга