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

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

 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);

 }

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

    разделяемую память */

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

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

  exit(1);

 }

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

 if (shmdt(msgptr) < 0) {

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

  exit(1);

 }

 /* Удалим созданные объекты IPC */

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже