signauxtpsreel .pdf



Nom original: signauxtpsreel.pdf
Auteur: alexandre COURTILLAT

Ce document au format PDF 1.5 a été généré par Microsoft® Word 2013, et a été envoyé sur fichier-pdf.fr le 12/03/2014 à 11:39, depuis l'adresse IP 86.221.x.x. La présente page de téléchargement du fichier a été vue 511 fois.
Taille du document: 35 Ko (4 pages).
Confidentialité: fichier public




Télécharger le fichier (PDF)










Aperçu du document


/******************************************************************************/
/* Lancement de F1, F2 et F3 avec synchro par SIGUSR1 */
/* AprÞs F1 est producteur et F2 et F3 son consommateur */
/* F1 produit Mang2 ou Mang3 F2 doit consommer le premer et F3 le second
*/
/* utilisation de signaux temps reel pour eviter de rater un kill
*/
/* cf page 179 livre de Blaess
/*
/******************************************************************************/
#include
#include
#include
#include
#include
#include
#include
#include

<stdio.h>
<stdlib.h>
<errno.h>
<sys/types.h>
<unistd.h>
<string.h>
<signal.h>
<time.h>

#define MAX 512
#define taille_msg 6
int fini = 0;
void retour(int sig, struct siginfo * info, void * inutilise){
fini++;
printf("sig %d consomme %d fois sur %d\n",sig,fini,info->si_value.sival_int);
}
void fin(int sig){
printf("on me demande de finir ..... FIN\n");
exit(0);
}
void rien(int sig){
//printf("%d\n",sig);
}
int main(int argc, char*argv[]){
int pfd[2],pid1,nlu,pid2,pid3;
char s[MAX];
struct sigaction action;
union sigval valeur_sig;
int cmpt=0, max=2, num;
char *tab[2]= {
"Mang2","Mang3" };
if (pipe(pfd) == -1) {perror("pipe");exit(1);}
if(argc == 2)

max = atoi(argv[1]);

pid1 = fork();
if(pid1 == -1) {perror("fork 1");exit(1);}
else
/************* fille 1 *************************************/
if(pid1 == 0){
signal(SIGUSR1,rien);
//signal(SIGINT,retour);
action.sa_sigaction = retour;
action.sa_flags = SA_SIGINFO;
sigemptyset(&action.sa_mask);

sigaction(SIGRTMIN + 2,&action,NULL);
nlu = read(pfd[0],s,sizeof(int));
printf("1 dit ma soeur2 est : %d\n",pid2=atoi(s));
nlu = read(pfd[0],s,sizeof(int));
printf("1 dit ma soeur3 est : %d\n",pid3=atoi(s));
kill(pid2,SIGUSR1);
pause();
printf("nous sommes : %d %d et %d\n\n je suis le producteur F1\n", getpid(), pid2, pid3);
srand(time(NULL));
while(cmpt < max) {
num = rand() % 2;
if(write(pfd[1],tab[num],6) == -1 ) {perror("write 1");exit(1);}
printf("**********************F1 Ó produit %s**********************\n",tab[num]);
cmpt++;
//pause();
}
while(fini != max){
pause();
}
kill(pid2,SIGUSR2);
kill(pid3,SIGUSR2);
}
else{
pid2 = fork();
if(pid2 == -1) {perror("fork 2");exit(1);}
else
/************* fille 2 *************************************/
if(pid2 == 0){
signal(SIGUSR1,rien);
signal(SIGUSR2,fin);
valeur_sig.sival_int = max;
srand(time(NULL));
printf("je suis fille 2 avec %d pour Pid\n",getpid());
pause();
nlu = read(pfd[0],s,sizeof(int));
printf("2 dit ma soeur3 est : %d\n",pid3=atoi(s));
kill(pid3,SIGUSR1);
pause();
printf("nous sommes : %d %d et %d\n\n je suis le consommateur F2\n", pid1, getpid(),pid3);
while(1){
num = 1 + (rand() % 2); // 1 ou 2 pour lire une ou deux fois dans le pipe
printf("F2 : Je lis %d fois\n",num);
while(num != 0){
nlu = read(pfd[0],s,6);
printf("F2 : a mange %d char : %s\n",nlu,s);
if(s[4]!='2'){
printf("F2 : c'est pas pour moi, je remets dans le pipe\n");
if(write(pfd[1],s,nlu) == -1 ) {perror("write 1");exit(1);}
}else{
printf("F2 : c'est pour moi Miammmmm\n");
sigqueue(pid1,2 + SIGRTMIN, valeur_sig);
//kill(pid1,SIGINT); // je prÚviens F1 que j'ai consommÚ

}
num--;
}
kill(pid3,SIGUSR1); // je rÚveille F3 pour qu'elle consomme
printf("F2 : je passe la main\n");
pause();
}
printf("je suis fille 2 et c'est fini\n");
}
else{

pid3 = fork();
if(pid3 == -1) {perror("fork 3");exit(1);}
else
/************* fille 3 *************************************/
if(pid3 == 0){
signal(SIGUSR1,rien);
signal(SIGUSR2,fin);
printf("je suis fille 3 avec %d pour Pid\n",getpid());
pause();
kill(pid1,SIGUSR1);
kill(pid2,SIGUSR1);
printf("nous sommes : %d %d et %d\n\n je suis le consommateur F3\n", pid1, pid2, getpid());
pause(); // attente que F2 est lu et traitÚ
while(1){
nlu = read(pfd[0],s,6);
printf("F3 : a mange %d char : %s\n",nlu,s);
if(s[4]!='3'){
printf("F3 : c'est pas pour moi, je remets dans le pipe\n");
if(write(pfd[1],s,nlu) == -1 ) {perror("write 1");exit(1);}
}else{
printf("F3 : c'est pour moi Miammmmm\n");
kill(pid1,SIGINT); // je prÚviens F1 que j'ai consommÚ
}
kill(pid2,SIGUSR1); // je rÚveille F2 pour qu'elle consomme
printf("F3 : je passe la main\n");
pause();
}
printf("je suis fille 3 et c'est fini\n");
/************* mere

}
}

}

}
*************************************/
else{
sleep(1);
sprintf(s,"%d",pid2);
if(write(pfd[1],s,strlen(s)) == -1 ) {perror("write 1");exit(1);}
sprintf(s,"%d",pid3);
if(write(pfd[1],s,strlen(s)) == -1 ) {perror("write 1");exit(1);}
sprintf(s,"%d",pid3);
if(write(pfd[1],s,strlen(s)) == -1 ) {perror("write 1");exit(1);}
wait(0);
wait(0);
wait(0);
printf(" mes filles sont mortes\n\n je pars\n");
}


signauxtpsreel.pdf - page 1/4
signauxtpsreel.pdf - page 2/4
signauxtpsreel.pdf - page 3/4
signauxtpsreel.pdf - page 4/4

Documents similaires


signauxtpsreel
avec sleep pour f2
solution fiche tp n3
tp2c
tp2
exos


Sur le même sujet..