#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <sys/msg.h>
#include <unistd.h>
#include <time.h>
#include <signal.h>
#include <sys/wait.h>


struct poruka
{
    long mtype;
    int func;
    //int pid;
}; 

struct delemem
{
    int niz[12];
    int size;
};



int main()
{
    srand(time(NULL));
    //rand()

    key_t msg_key = ftok("glavni_cvor.c",1);
    key_t shm_key = ftok("glavni_cvor.c",2);
    key_t sem_key = ftok("glavni_cvor.c",3);
    int msg_id = msgget(msg_key,IPC_CREAT|0666);
    int shm_id = shmget(shm_key,sizeof(struct delemem),IPC_CREAT|0666);
    int sem_id = semget(sem_key,3,IPC_CREAT|0666);
    struct delemem *dm = (struct delemem*)shmat(shm_id,NULL,0);
    printf("Korisnik: uzima i stavnja random vrednosti u deljenu memoriju.\n");
    for(int i=0;i<12;i++)
    {
        dm->niz[i] = rand()%100;
    }
    printf("Korisnik: bira nasumicno funkciju.\n");
    int f = rand()%4;
    struct poruka p;
    p.mtype = 1;
    struct sembuf P1 = {1,-1,0};
    struct sembuf V1 = {1,1,0};
    p.func = f;
    printf("Korisnik: salje zahtev glavnom cvoru.\n");
    msgsnd(msg_id,&p,sizeof(p) - sizeof(long),0);
    semop(sem_id,&P1,1);//osigurava svoje mesto

    printf("Korisnik: ceka odgovor od glavnog cvora.\n");

    msgrcv(msg_id,&p,sizeof(p)-sizeof(long),0,0);
    semop(sem_id,&V1,1);
    printf("Resenje je: %d\n",p.func);
    printf("Korisik: Zavrsio sa radom.\n");
    shmdt(dm);

    return 0;
}