All pastes #958083 Raw Edit

remi

public text v1 · immutable
#958083 ·published 2008-03-26 13:51 UTC
rendered paste body
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <signal.h>

int OK=0;
int m1[2];
int m2[2];


pid_t livreur_pid[3];




void envoiM1(int s)
{
	signal(SIGUSR1, envoiM1);
	
	OK=1;
	
	
}



void envoiM2(int s)
{
	signal(SIGUSR2, envoiM2);
	
	OK=2;
	
	
}



void machine(int num)
{
	int b, p, d;
	
	/*orientation des tubes*/
	if(close(m1[1])==-1)
	{
		perror("Erreur fermeture en ecriture tube m1\n");
		exit(1);
	}
	
	if(close(m2[1])==-1)
	{
		perror("Erreur fermeture en ecriture tube m2\n");
		exit(1);
	}
	/*on ferme le tube dans lequel on ne va pas lire*/
	switch(num)
	{
		case 0:
			if(close(m2[0])==-1)
			{
				perror("Erreur fermeture en lecture tube m2\n");
				exit(1);
			}
			break;
		case 1:
			if(close(m1[0])==-1)
			{
				perror("Erreur fermeture en lecture tube m2\n");
				exit(1);
			}
			break;
	}
	
	
	
	
	
	/*lecture de la boisson*/
	switch(num)
	{
		case 0:
			kill(livreur_pid[0], SIGUSR1);
			if(read(m1[0], &b, sizeof(int))==-1)
			{
				perror("Erreur lecture boisson m1\n");
				exit(3);
			}
			
			break;
		case 1:
			kill(livreur_pid[0], SIGUSR2);			
			if(read(m2[0], &b, sizeof(int))==-1)
			{
				perror("Erreur lecture reception boisson m2\n");
				exit(3);
			}
			
			break;
	}
		
	
	/*lecture du plat*/
	switch(num)
	{
		case 0:
			kill(livreur_pid[1], SIGUSR1);
			if(read(m1[0], &p, sizeof(int))==-1)
			{
				perror("Erreur lecture boisson m1\n");
				exit(3);
			}
			
			break;
		case 1:
			kill(livreur_pid[1], SIGUSR2);			
			if(read(m2[0], &p, sizeof(int))==-1)
			{
				perror("Erreur lecture reception boisson m2\n");
				exit(3);
			}
			
			break;
	}
		
	
	/*lecture du dessert*/
	switch(num)
	{
		case 0:
			kill(livreur_pid[2], SIGUSR1);
			if(read(m1[0], &d, sizeof(int))==-1)
			{
				perror("Erreur lecture boisson m1\n");
				exit(3);
			}
			
			break;
		case 1:
			kill(livreur_pid[2], SIGUSR2);			
			if(read(m2[0], &d, sizeof(int))==-1)
			{
				perror("Erreur lecture reception boisson m2\n");
				exit(3);
			}
			
			break;
	}
		
	if(num==1)
		printf("\t\t\t");
	
	printf("Nouveau repas de la part de machine %d\n", num+1);
	
	exit(0);
	
}




void livreur(int num)
{
	int p=num;
	
	signal(SIGUSR1, envoiM1);
	signal(SIGUSR2, envoiM2);

	if(close(m1[0])==-1)
	{
		perror("Erreur orientation ecriture tube m1\n");
		exit(1);
	}
	
	
	if(close(m2[0])==-1)
	{
		perror("Erreur orientation ecriture tube m2\n");
		exit(1);
	}
	
	
	if(!OK)
		pause();
	
	if(OK==1)
	{
		if(write(m1[1], &p, sizeof(int))==-1)
		{
			perror("Erreur ecriture tube m1\n");
			exit(3);
		}
	}
	else if(OK==2)
	{
		if(write(m2[1], &p, sizeof(int))==-1)
		{
			perror("Erreur ecriture tube m2\n");
			exit(3);
		}
	}
	
	OK=0;	

	exit(0);
}


int main(int argc, char *argv[])
{

	int i;

	if(pipe(m1)==-1)
	{
		perror("Erreur creation tube boisson\n");
		exit(1);
	}
	if(pipe(m2)==-1)
	{
		perror("Erreur creation tube plat\n");
		exit(1);
	}
	


	/*création des processus livreurs*/
	for(i=0; i<3; i++)
	{
		switch((livreur_pid[i]=fork()))
		{
			case -1:
				perror("Erreur creation processus livreur\n");
				exit(2);
			case 0:
				livreur(i);
			default : break;
		}
	}
	

	/*création des processus machines*/
	for(i=0; i<2; i++)
	{
		switch(fork())
		{
			case -1:
				perror("Erreur creation processus machine\n");
				exit(2);
			case 0:
				machine(i);
			default : break;
		}
	}
	

		
	return 0;
}