1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
|
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/signal.h>
#include<sys/time.h>
#include<sys/wait.h>
#include <sched.h>
#include<errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int f1, f2;
int p[2]; // L/E du paipe (j'uste pour faire passer le nb de fils Crée) // tableau des descripteurs
int prio =0, polit =0;
int nb_papa =0;
int nb_fils = 1;
pid_t pid;
int politique,status,priorite, n;
struct sched_param param;
struct timespec quantum;
int pri[5]; // = {1, 2, 3, 4, 5}; // pour affecter les prioriter au processuse. // definire le sénario
long pol_scheduler[2];
int choix[5]; // = {0, 1, 2, 0, 1}; // pour affecter les politique de scheduling au processus. // definire le sénario
int k;
static void hand_fils()
{
pol_scheduler[0] = SCHED_RR;
pol_scheduler[1] = SCHED_FIFO;
pol_scheduler[2] = SCHED_OTHER;
//en fait ici les Modif de Politique et de prioriter.
// il faut pour chaque fils s'a politique !!
printf("Le Fils : mon pid est: %d, le pid de Mon papa est: %d\n", getpid(), getppid());
read (p[0],&nb_fils,1);
printf ("Le processus Fils N°%d a recu: \n", nb_fils);
//int prio;
lseek(f1,-1,SEEK_CUR);
read (f1,&prio,1);
// affectation des prioriter dans tableau de la prioriter de 1 a ...
//int polit;
lseek(f2,-1,SEEK_CUR);
read (f2,&polit,1);
//affectation des politique dans tableau de la politique de 0 a ...
param.sched_priority = pri[prio]; // pour le cas ou il y'a 7 procesuss fils
setpriority(PRIO_PROCESS, pid, pri[prio]);
k = choix[polit]; // sa ce ra par order puisque nb 1 puis 2, 3, 4 .... par ordre croisant
if(sched_setscheduler(pid, pol_scheduler[k], ¶m) == -1)
perror("problème scheduler");
priorite = getpriority(PRIO_PROCESS, pid);
printf("je suis le fils, ma priorité d'ordonnancement est: %d\n", priorite);
politique = sched_getscheduler(pid);
if(politique == SCHED_RR)
printf("je suis le fils, ma politique d'ordonnancement est: SCHED_RR \n\n");
if(politique == SCHED_FIFO)
printf("je suis le fils, ma politique d'ordonnancement est: SCHED_FIFO \n\n");
if(politique == SCHED_OTHER)
printf("je suis le fils, ma politique d'ordonnancement est: SCHED_OTHER \n\n");
//printf("fonction hand_Fils \n");
}
static void hand_papa()
{
// printf("fonction hand_Papa\n");
}
int fork_n()
{
int i;
f1 = open ("./priorite.dat",O_RDWR|O_CREAT,S_IRWXU);
f2 = open ("./politique.dat",O_RDWR|O_CREAT,S_IRWXU);
pipe(p); //Création du paipe
pid = fork();
if (pid == 0)
{ // processus fils
close(p[1]);
/* on rempli une structure sigaction en pr�cisant l'action a executer a reception du signal */
struct sigaction action = {.sa_handler = hand_fils};
sigaction(SIGUSR1, &action, NULL);
for (n=0;n<1;n++)
{
pause();
sleep(1);
kill(getppid(), SIGUSR1);
}
close(p[0]);
return(pid); //le pid du fils
}
else
{ // processuse pére (c'est le pér qui comance le 1er)
close(p[0]);
nb_papa++;
struct sigaction action = {.sa_handler = hand_papa};
sigaction(SIGUSR1, &action, NULL);
write (p[1],&nb_fils,1);
nb_fils = nb_fils + 1 ;
for (n=0;n<1;n++) // le NB de variable lu/ Ecrie dans un fichier
{
write(f1,&prio,1);
prio = prio + 1;
write(f2,&polit,1);
polit = polit + 1;
sleep(1);
kill(pid, SIGUSR1);
// pause (); //si en ne fait pas: pour que le pére crée des fils son attander la fin du 1er... )
}
close(p[1]);
wait(&status); // le pére atant la términésant du fils
close(f1); close(f2);
return(pid); //le pid du Pére
}
}
int main(){
int i;
int return_value;
printf("\nDans le Main :\n le pid du grand pére est: %d, le pid de son Bash est: %d\n", (int) getpid(), (int) getppid());
for(i=0; i<3 ; i++)
{
printf("\nDonnée la Prioriter du processus P%d (une valeur de 1 a 99 )", i+1); scanf("%d", &pri[i]); // Prioriter de P1
printf("Donnée la Politique du processus P%d (une valeur de 0 a 2)", i+1); scanf("%d", &choix[i]); // Politique de P1
// sachant que : 0 = SCHED_RR;
// sachant que : 1 = SCHED_FIFO;
// sachant que : 2 = SCHED_OTHER;
}
printf("\n\n");
for(i=0;i < 3; i++)
{
switch (fork_n())
{
case -1: exit(1);
case 0: { // je suis le Fils
// printf("\nDans le Main:\n le Fils : mon pid est %d, le pid de Mon papa est %d\n", getpid(), getppid());
system("echo " " >> journal");
return_value = system("ps -elf | grep ./TP_sys3 >> journal");
system("echo " " >> journal");
exit(0); //return(0); // Pour Tuérs le fills il ne Boucle Pas
}
default: { // je suis le Pére
}
}
}
wait(&status); // le péré attant la términéson de tous c'est fils
} |