97 lines
2.3 KiB
C
97 lines
2.3 KiB
C
#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;
|
|
} |