//consumer.c
#include <stdlib.h>
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <string.h>
#include <sys/stat.h>
#define SEM_KEY 6666
union semun{
int setval;
struct semid_ds *buf;
unsigned short *array;
};
int main(int argc, char* argv[])
{
int shmid;
float *addr;
float h, w;
shmid = shmget(ftok(".",1000),getpagesize(), IPC_CREAT | 0666);
printf("shmid = %d\n", shmid);
if(shmid == -1)
{
perror("shmget error");
exit(EXIT_FAILURE);
}
addr = shmat(shmid, 0, 0);
if(-1 == *addr)
{
perror("shmat error");
exit(EXIT_FAILURE);
}
int semid;
int ret;
semid = semget(SEM_KEY, 0, IPC_CREAT | 0600);
if(-1 == semid)
{
perror("semget");
exit(EXIT_FAILURE);
}
printf("semid = %d\n", semid);
struct sembuf sem_opt_wait1[1] = {0,-1, SEM_UNDO};
struct sembuf sem_opt_wakeup1[1] = {0, 1, SEM_UNDO};
struct sembuf sem_opt_wait2[1] = {1, -1, SEM_UNDO};
struct sembuf sem_opt_wakeup2[1] = {1,1, SEM_UNDO};
while(1)
{
semop(semid, sem_opt_wait1, 1);
h = *addr;
w = *(addr + 1);
printf("h= %f\t w= %f\n", h,w);
if(h==1.0 || w ==1.0) break;
ret = w/(h*h/10000);
if(ret >= 20 && ret <=25)
{
printf("Ok!\n");
} else if(ret <20)
{
printf("thin!\n");
} else
{
printf("fat\n");
}
semop(semid, sem_opt_wakeup2, 1);
}
if(-1 == semctl(semid, 1, IPC_RMID,0))
{
perror("semctl error");
exit(EXIT_FAILURE);
}
if(-1 == shmdt(addr))
{
perror("shmdt error");
exit(EXIT_FAILURE);
}
if(shmctl(shmid, IPC_RMID,0) == -1)
{
perror("shctl error");
exit(EXIT_FAILURE);
}
return 0;
}
//producer.c
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/sem.h>
#define SEM_KEY 6666
union semun{
int setval;
struct semid_ds *buf;
unsigned short *array;
};
int main(int argc, char *argv[])
{
int shmid;
float *addr;
float h,w;
shmid = shmget(ftok(".", 1000),getpagesize(), IPC_CREAT | 0666);
printf("shmid = %d\n", shmid);
if(shmid == -1)
{
perror("shmget error.");
exit(EXIT_FAILURE);
}
addr = shmat(shmid, 0,0);
if(-1 == *addr)
{
perror("shmat error.");
exit(EXIT_FAILURE);
}
int semid;
int ret;
semid = semget(SEM_KEY, 2, IPC_CREAT | 0600);
if(-1 == semid)
{
perror("semget");
exit(EXIT_FAILURE);
}
printf("semid = %d\n", semid);
union semun sem_args;
unsigned short array[2] = {0, 1};
sem_args.array = array;
ret = semctl(semid, 1, SETALL, sem_args);
if(-1 == ret)
{
perror("semctl");
exit(EXIT_FAILURE);
}
struct sembuf sem_opt_wait1[1] = {0,-1,SEM_UNDO};
struct sembuf sem_opt_wakeup1[1] = {0, 1, SEM_UNDO};
struct sembuf sem_opt_wait2[1] = {1, -1, SEM_UNDO};
struct sembuf sem_opt_wakeup2[1] = {1, 1, SEM_UNDO};
while(1)
{
semop(semid, sem_opt_wait2,1);
printf("enter your height and weight:\n");
scanf("%f %f", addr, addr+1);
semop(semid, sem_opt_wakeup1, 1);
if(*addr == 1 || *(addr + 1) == 1) break;
}
return 0;
}