// event.c
//execution en mode administrateur
#include <sched.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/resource.h>

#define N 4
int main (int argc, char **argv) {
pid_t pidf;
int  a,b,i ;
int fd ; /* descripteur de fichier */
char buf[N],c; ;
struct sched_param priorite, p ;
struct timeval Date;

fd=open(argv[1],O_RDONLY);
if (fd ==-1) {printf("erreur lors de l'ouverture du fichier ");
		exit(1) ;
		}
/* lire une ligne du fichier */
  a=read(fd, &buf, 4); 
  srand(getpid());
  while (a==N) {

	   if ((pidf=fork())==0) {  
/* processus créé pour traiter l'événement	   */
	   	printf("\n \n NOUVEL EVENEMENT : NOUVEAU PROCESSUS\n");
		usleep(10);
		gettimeofday(&Date, NULL);
		/* gettimeofday met l'heure courante en secondes 
		et microsecondes dans les champs tv_sec et tv_usec 
		de Date respectivement */
				
		sched_getparam (0,&p);
		printf("\t\t Processus %d de priorite %d se trouvant ", 
getpid(), p.sched_priority);
		
		i=sched_getscheduler(pidf) ;
		switch (i) {
			case SCHED_FIFO : printf("dans la file SCHED_FIFO \n" ) ; 
break ;
			case SCHED_RR : printf("dans la file SCHED_RR \n" ) ; 
break ;
			case SCHED_OTHER :printf("dans la file SCHED_OTHER \n" ); 
break ;
		  }
		printf("==>A l'instant %ld:%ld, traitement de l'evenement %c 
\n", 	Date.tv_sec, Date.tv_usec, buf[2]); 
		usleep(1000*rand());	
		  
		  exit(0);
		}
	   else  { /* pere */ 
	   	printf(" \nfile d'ordo initiale du processus %d est :  ", 
pidf) ;
		b=sched_getscheduler(pidf) ;
		switch (b) {
			case SCHED_FIFO : printf("SCHED_FIFO \n" ) ; break ;
			case SCHED_RR : printf("SCHED_RR \n" ) ; break ;
			case SCHED_OTHER : printf("SCHED_OTHER \n" ) ; break ;
		  }
		c= buf[1];
		priorite.sched_priority = atoi(&c) ;
		printf("le processus %d vient d'etre insere dans la file " ,
 pidf) ;
		switch (buf[0]) {
			case 'A' : printf("SCHED_FIFO avec la priorite
 %c\n",buf[1] ) ; 
			 sched_setscheduler (pidf, SCHED_FIFO, &priorite ) ; 
			 break ;
			case 'B' : printf(" SCHED_RR avec la priorite %c\n" ,
 buf[1] ) ; 
		    sched_setscheduler (pidf, SCHED_RR, &priorite ) ; 
	     	   break ;
		  }
		}
	   a=read(fd, &buf, 4);
	   
	}
	close(fd) ;
}
