// Melita iohaljevic 0036411392
//Ostvariti komunikaciju medu procesima tipa proizvodaca i potrošaca korištenjem redova poruka. 
// glavni program: program koji ce povezati rad proizvodaca i potrošaca. Programom treba odrediti koliko proizvodaca se želi stvoriti i unijeti nizove znakova za svakoga od njih

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#include <string.h>

//main:
int main(int argc, char *argv[]){
	int i;
	int msqid;
	key_t uid;

// primanje argumenata program se poziva kako je navedeno u print dijelu	
	if (argc < 2) {
		printf("./a.out poruka1 poruka2 poruka3,....\n");
		exit(1);
	}
	uid = ftok("./tmp",'m');	// nacin dobivanja uid  za ostvarenje reda poruka jer nikako nisam uspjela s varijablama okoline to podesiti , a i u literaturi 
								// se ovaj nacin dosta koristi (dobijem jedinstveni kljuc)
	if ((msqid = msgget (uid, IPC_CREAT|0666)) == -1){	// stvaram red poruka i vracam id reda poruka IPC_CREATE koristim ako red postoji na njega se prikljucim
		printf(" Nije moguce stvoriti red poruka\n");
		exit(1);
	}
	printf ("msqid = %d\n",msqid); // vraca ID reda poruka samo radi provjere

	for(i = 1; i< argc; i ++) { // dtvaram proizvodjace onoliko koliko sam poruka zadala u pozivu programa
		switch (fork()) {
			case -1:
				printf("Ne mogu stvoriti proces proizvodjac\n");
				exit(1);
				break;
			case 0:
				printf("Stvaram proizvodjaca\n");
				execl("./proizvodjac","proizvodjac",argv[i], NULL); // prepisujem sa execl i pozivam ./proizvodjac
				exit(1);
				break;
		}
	}
	
	switch (fork ()) { // stvaram jednog potrosaca koji trosi zadane poruke
		case -1 :
			printf("Ne mogu stvoriti proces potrosac\n");
			exit(1);
			break;
		case 0:
			printf("Stvaram potrosaca\n");
			execl("./potrosac","portrosac",NULL); // prepisujem sa execl i potrosacem
			exit(1);
			break;
	}
	
	for (i = 0; i <argc; i ++) { // cekam da zavrse i da ih sredim na kraju 
		wait(NULL);
	}
	return 0;
}
	
	

