SK/processes/semshm/c2-ssem.c

97 lines
2.3 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>
#include <signal.h>
const char *path = "/tmp/sem.server341321";
char *buf;
key_t sem_key, shm_key;
struct sembuf sem;
int sem_id, shm_id;
void handle_error(char *txt)
{
perror(txt);
exit(-1);
}
void exit_prog()
{
// shmdt(buf);
semctl(sem_id, 0, IPC_RMID);
semctl(sem_id, 1, IPC_RMID);
shmctl(shm_id, IPC_RMID, NULL);
unlink(path);
exit(0);
}
int main()
{
sem.sem_flg = 0;
signal(SIGINT, exit_prog);
if (access(path, F_OK) == 0)
unlink(path);
if (mknod(path, 0600 | S_IFREG, 0) == -1)
handle_error("mknod");
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("semget");
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");
u_short semset[] = {1, 0};
if (semctl(sem_id, 0, SETALL, semset) == -1)
handle_error("semctl set");
if (semop(sem_id, &sem, 1) == -1)
handle_error("semop 1");
double d1;
while (1)
{
{
sem.sem_num = 1;
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 2");
// printf("b\n");
}
{
// sem.sem_num = 1;
// sem.sem_op = -1;
// if (semop(sem_id, &sem, 1) == -1)
// handle_error("semop 1");
sleep(1);
d1 *= d1;
memcpy(buf, &d1, sizeof(double));
printf("sent %f\n", d1);
sem.sem_num = 0;
sem.sem_op = 1;
if (semop(sem_id, &sem, 1) == -1)
handle_error("semop 2");
printf("b\n");
}
}
return 0;
}