Шрифт:
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);
}