Вход/Регистрация
Операционная система UNIX
вернуться

Робачевский Андрей Михайлович

Шрифт:

 0, -1, 0

};

Сервер:

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

#include <sys/shm.h>

#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),

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 <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

#include <sys/shm.h>

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

 }

  • Читать дальше
  • 1
  • ...
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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