C > Tours de Hanoï avec signal()

TitreTours de Hanoï avec signal()
Postée le01-01-2011
Affichée343
Mini-lien
Description

tubes et signaux

EtatContient des erreurs. Contient des erreurs.
Code d'insertion
Options
Afficher les numéros de lignes  Mettre la source en plein ecran  Selectionner la source  Partager sur Facebook 
Téléchargement Telecharger en format txt  Telecharger en format pdf  Telecharger en format c
Plein ecran
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<signal.h>

#define FROM 1
#define TO 3
#define USING 2


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;

            case 0 :
                hanoi(n-1, from, using, to);
                close(fd1[0]);

                //ecriture du message
                if(write(fd1[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) !=pid1); //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);
                }

                printf("deplace %d --> %d\n", from, to);

                //envoie du signal
                kill (getppid(), SIGUSR1);

                //création du deuxième fils
                switch (pid2 = fork())
                {
                    case -1 :
                        printf ("Erreur à la création du fils");
                        break;

                    case 0 :
                        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";

    if (argc !=2)
    {
        fprintf(stderr, "usage: %s NombreDeDisques \n", argv[0]);
        exit (1);
    }
    n = atoi (argv[1]);

    //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;

        case 0 :
            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);
            }
    }

    return 0;
}