#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>




union semun{
    int val;
}arg;

typedef struct{
    long tip;
    int cvorovi[12];
    int operacija;
    int rezultat;
    int niz[4];
    int rd_broj;
    int pid;
    int rez[3];
}Operacija;


enum{PRISTUP_KLASTERU,PRIJAVA_TRI_REDNA_CVORA,OBAVLJENI_ZADACI};

int main(){

    key_t msgkey=ftok("./init.c",'Q');
    int msgid=msgget(msgkey,IPC_CREAT|0666);

    key_t shmkey=ftok("./init.c",'M');
    int shmid=shmget(shmkey,sizeof(Operacija),IPC_CREAT|0666);

    key_t semkey=ftok("./init.c",'S');
    int semid=semget(semkey,3,IPC_CREAT|0666);

    struct sembuf P={0,-1,0},V={0,1,0};
    Operacija *op=(Operacija*) shmat(shmid,NULL,0);
    printf("Glavni cvor ceka zadatak od korisnika\n");
    msgrcv(msgid,&op,sizeof(op)-sizeof(long),1,0);

    P.sem_num=PRIJAVA_TRI_REDNA_CVORA;
    P.sem_op=-3;
    semop(semid,&P,1);
    Operacija op1;
    Operacija op2;
    Operacija op3;
    op1->tip=2;
    op1->rd_broj=1;
    op1->operacija=op->operacija;
    op2->tip=2;
    op2->rd_broj=2;
    op2->operacija=op->operacija;
    op3->tip=2
    op3->rd_broj=3;
    op3->operacija=op->operacija;
    msgsnd(msgid,&op1,sizeof(op)-sizeof(long),0);
    msgsnd(msgid,&op2,sizeof(op)-sizeof(long),0);
    msgsnd(msgid,&op3,sizeof(op)-sizeof(long),0);
    printf("Glavni cvor prosledjuje rednim cvorovima operacije\n");

    msgrcv(msgid,&op1,sizeof(op)-sizeof(long),3,0);
    msgrcv(msgid,&op2,sizeof(op)-sizeof(long),3,0);
    msgrcv(msgid,&op3,sizeof(op)-sizeof(long),3,0);
    printf("Glavni cvor ceka da radni cvorovi obave svoj zadatak\n");

    op->rez[0]=os1->rezultat;
    op->rez[1]=os2->rezultat;
    op->rez[2]=os3->rezultat;
    op->rezultat=op->rez[0]+op->rez[1]+op->rez[2]
    
    printf("Glavni cvor obavlja konacnu agregaciju\n");
    op->pid=getpid();
    msgsnd(msgid,&op,sizeof(op)-sizeof(long),0);
    printf("Glavni cvor salje konacan rezultata koristniku\n");

    V.sem_num=OBAVLJENI_ZADACI
    V.sem_op=1;
    semop(semid,&V,1);

    return 0;

}