#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <unistd.h>
// Структура для сообщения
struct Message {
char data[4096]; // Максимальная длина сообщения
};
int main() {
// Получение идентификатора разделяемой области памяти
int shm_id = shmget(IPC_PRIVATE, sizeof(struct Message), IPC_CREAT | 0666);
if (shm_id == -1) {
perror("shmget");
exit(1);
}
// Получение указателя на разделяемую область памяти
struct Message *shm_msg = (struct Message *)shmat(shm_id, NULL, 0);
if ((int)shm_msg == -1) {
perror("shmat");
exit(1);
}
// Получение идентификатора семафора
int sem_id = semget(IPC_PRIVATE, 1, IPC_CREAT | 0666);
if (sem_id == -1) {
perror("semget");
exit(1);
}
// Инициализация семафора
union semun {
int val;
struct semid_ds *buf;
ushort *array;
} sem_init;
sem_init.val = 0; // Изначально семафор заблокирован
if (semctl(sem_id, 0, SETVAL, sem_init) == -1) {
perror("semctl");
exit(1);
}
// Ожидание ответа от сервера
struct sembuf wait_op = {0, -1, 0}; // Заблокировать семафор клиента 2
if (semop(sem_id, &wait_op, 1) == -1) {
perror("semop");
exit(1);
}
// Вывод ответа от сервера
printf("Клиент 2 получил ответ от сервера:\n%s\n", shm_msg->data);
// Отключение разделяемой области памяти
shmdt(shm_msg);
return 0;
}