SK/processes/c2-csem.c

78 lines
1.7 KiB
C
Raw Normal View History

2023-02-10 17:00:31 +01:00
#include <unistd.h>
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <stdlib.h>
const char *path = "/tmp/sem.server341321";
void handle_error(char *txt)
{
perror(txt);
exit(-1);
}
char *buf;
int main()
{
key_t sem_key, shm_key;
struct sembuf sem;
sem.sem_flg = 0;
int sem_id, shm_id;
if (access(path, F_OK) != 0)
handle_error("file does not exist");
if ((sem_key = ftok(path, 0)) == -1)
handle_error("ftok sem");
if ((shm_key = ftok(path, 1)) == -1)
handle_error("ftok shm");
if ((sem_id = semget(sem_key, 2, 0600 | IPC_CREAT)) == -1)
handle_error("shmget");
if ((shm_id = shmget(shm_key, sizeof(1024), 0600 | IPC_CREAT)) == -1)
handle_error("shmget");
if ((buf = shmat(shm_id, 0, 0)) == NULL)
handle_error("shmat");
double d1 = 23;
// while (1)
{
sem.sem_num = 0;
sem.sem_op = -1;
if (semop(sem_id, &sem, 1) == -1)
handle_error("semop 1");
// printf("a\n");
memcpy(buf, &d1, sizeof(double));
printf("sent %f\n", d1);
sem.sem_num = 1;
sem.sem_op = 1;
if (semop(sem_id, &sem, 1) == -1)
handle_error("semop 2");
// printf("b\n");
}
{
sem.sem_num = 0;
sem.sem_op = -1;
if (semop(sem_id, &sem, 1) == -1)
handle_error("semop 1");
memcpy(&d1, buf, sizeof(double));
printf("received %f\n", d1);
sem.sem_num = 0;
sem.sem_op = 1;
if (semop(sem_id, &sem, 1) == -1)
handle_error("semop 1");
// printf("b\n");
}
if (shmdt(buf) == -1)
handle_error("shmdt");
return 0;
}