void fonctionsignal(int sig) { if(sig == SIGUSR1) { fprintf(stderr,"Ecriture du message par un fils\n"); } }
void hanoi(int n,int from,int to,int using) { int pid1, pid2, statut, cpt; int fd1[2], fd2[2]; char buf[30], msg[]="Processus terminer avec succes";
if(n>0) { //création des tubes if(pipe(fd1)==-1) { perror("Erreur à la création du tube"); exit(-2); } if(pipe(fd2)==-1) { perror("Erreur à la création du tube"); exit(-2); }
//création du premier fils switch(pid1 = fork()) { case-1: printf("Erreur à la création du fils"); break;
//création du deuxième fils switch(pid2 = fork()) { case-1: printf("Erreur à la création du fils"); break;
case0:
hanoi(n-1, using, to, from);
close(fd1[0]);
//ecriture du message if(write(fd2[1],msg,sizeof(msg))==-1) { perror("Erreur lors de l'écriture du message"); exit(-3); }
break; default: //reception du signal if(signal(SIGUSR1, fonctionsignal)== SIG_ERR) { fprintf(stderr,"Erreur lors de l'association du signal\n"); exit(-1); } while(wait(&statut)!=pid2);//attend que le fils se termine
close(fd[1]);
//lecture du message while((cpt=read(fd1[0],buf,sizeof(buf)-1))>0) {
buf[cpt]='/0'; fprintf(stderr,"%s\n", buf); }
} } } }
int main(int argc,char**argv) { int n, statut, cpt; int fd[2]; char buf[30], msg[]="Processus terminer avec succes";
//Création du tube if(pipe(fd)==-1) { perror("Erreur à la création du tube"); exit(-2); }
//Création du fils switch(pid = fork()) { case-1: printf("Erreur à la création du fils"); break;
case0:
hanoi(n, FROM, TO, USING);
close(fd[0]);
//ecriture du message if(write(fd[1],msg,sizeof(msg))==-1) { perror("Erreur lors de l'écriture du message"); exit(-3); }
break; default: //reception du signal if(signal(SIGUSR1, fonctionsignal)== SIG_ERR) { fprintf(stderr,"Erreur lors de l'association du signal\n"); exit(-1); }
while(wait(&statut)!=pid);//attend que le fils se termine //lecture du tube
close(fd[1]); while((cpt=read(fd[0],buf,sizeof(buf)-1))>0) {
buf[cpt]='/0'; fprintf(stderr,"%s\n", buf); } }