Читаем Операционная система UNIX полностью

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

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

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

  exit(1);

 }

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

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

  PERM | IPC_CREAT)) < 0) {

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

  exit(1);

 }

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

 if ((msgptr = (Message*)shmat(shmid, 0, 0)) < 0) {

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

  exit(1);

 }

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

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

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

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

 if ((semid = semget(key, 2, PERM | IPC_CREAT)) < 0) {

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

  exit(1);

 }

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

 if (semop(semid, &proc_wait[0], 1) < 0) {

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

  exit(1);

 }

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

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

 if (semop(semid, &mem_lock[0], 2) < 0) {

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

  exit(1);

 }

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

 printf(%s, msgptr->buff);

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

 if (semop(semid, &mem_unlock[0], 1) < 0 {

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

  exit(1);

 }

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

 if (shmdt(msgptr) < 0) {

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

  exit(1);

 }

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

 exit(0);

}

Клиент:

#include

#include

#include

#include

#include "shmem.h"

main() {

 Message *msgptr;

 key_t key;

 int shmid, semid;

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

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

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

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

  exit(1);

 }

 /* Получим доступ к разделяемой памяти */

 if ((shmid = shmget(key, sizeof(Message), 0)) < 0) {

  printf("Ошибка доступа\n");

  exit(1);

 }

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

 if ((msgptr = (Message*)shmat(shmid, 0, 0)) < 0) {

  prinf("Ошибка присоединения\n);

  exit(1);

 }

 /* Получим доступ к семафору */

 if ((semid = semget(key, 2, PERM)) < 0) {

  printf("Ошибка доступа\n");

  exit(1);

 }

 /* Заблокируем разделяемую память */

 if (semop(semid, &mem_lock[0], 2) < 0) {

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

  exit(1);

 }

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

 if (semop(semid, &proc_start[0], 1) < 0) {

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

  exit(1);

 }

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

 sprintf(msgptr->buff, "Здравствуй, Мир!\n");

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

 if (semop(semid, &mem_unlock[0], 1) < 0) {

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

  exit(1);

 }

Перейти на страницу:

Похожие книги

Архитектура операционной системы UNIX (ЛП)
Архитектура операционной системы UNIX (ЛП)

Настоящая книга посвящена описанию внутренних алгоритмов и структур, составляющих основу операционной системы (т. н. «ядро»), и объяснению их взаимосвязи с программным интерфейсом. Таким образом, она будет полезна для работающих в различных операционных средах. При работе с книгой было бы гораздо полезнее обращаться непосредственно к исходному тексту системных программ, но книгу можно читать и независимо от него.  Во-вторых, эта книга может служить в качестве справочного руководства для системных программистов, из которого последние могли бы лучше уяснить себе механизм работы ядра операционной системы и сравнить между собой алгоритмы, используемые в UNIX, и алгоритмы, используемые в других операционных системах. Наконец, программисты, работающие в среде UNIX, могут углубить свое понимание механизма взаимодействия программ с операционной системой и посредством этого прийти к написанию более эффективных и совершенных программ.

Морис Дж Бах , Морис Дж. Бах

ОС и Сети, интернет / ОС и Сети / Книги по IT