cobbleguard a écrit 1 commentaire

  • [^] # Re: Pointeur non initialisé

    Posté par  . En réponse au message passer une struct dans une shared memory POSIX. Évalué à 1.

    voila g corrige et ca marche.....

    code PS2:



    #include <sys/types.h>
    #include <sys/mman.h>
    #include <sys/stat.h>
    #include <sys/fcntl.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <signal.h>
    #include <semaphore.h>
    #include <sys/mode.h>

    struct ascenceur
    {
    int id;
    int charge;
    int portes;
    int NB_in;
    int NB_max;
    int dest;
    };

    struct etage
    {
    int id;
    int occupation;
    int asc_stop;
    };



    /*____________________________________DECLARATIONS POUR SEMAPHORES NOMMES_____________*/
    sem_t *ptr_sema=NULL ;
    sem_t *ptr_sema2=NULL;
    int oflags = O_CREAT ;
    mode_t mode = 0644 ;
    const char semname1 [] = "/tmp/semapn" ;
    const char semname2 [] = "/tmp/semapm" ;
    unsigned int value = 1 ;




    int ret_val ;
    struct transport
    {
    int actuel ;
    int dest ;
    int NB_pass;
    }trajet, trajet2;

    /*___________________________________DECLARATIONS POUR MEMOIRE PARTAGEE GLOBLALE_____*/
    int shm_etage1;
    int shm_etage2;
    caddr_t shm_ptr1;


    main (int argc, char *argv[])
    {
    printf("\n\t\tPROGRAMME PRINCIPAL");
    int lire;
    struct transport trajet;
    int t=1;
    trajet.actuel=3;
    trajet.dest=4;
    trajet.NB_pass=5;


    /*ouverture du tube*/
    lire = open("tube", O_RDONLY);
    /*creation memoire partagee*/
    shm_etage1 = shm_open ( "/tmp/etage1", (O_CREAT | O_RDWR), 0 );
    if(shm_etage1 == -1)
    perror("\nopen shm_etage1 failled:");
    /*modification des droits d'acces*/
    ret_val = fchmod ( shm_etage1 , (mode_t) S_IRWXG | S_IRWXU | S_IRWXO );
    if(ret_val == -1)
    perror("\nfchmod etage 1 failled:");
    /*creation d'un semaphore nomme*/
    ptr_sema = sem_open ( semname1, oflags, mode, value );
    if ( ptr_sema == (void *) -1 )
    { perror ( "\n\rMAIN : sem_open failed->sem1 !!!" ); exit( 1 ); }


    /*creation d'un semaphore nomme*/

    ptr_sema2 = sem_open ( semname2, oflags, mode, value );
    if ( ptr_sema == (void *) -1 )
    { perror ( "\n\rMAIN : sem_open failed ->sem2!!!" ); exit( 1 ); }
    printf("\n*****OK 2 SEMAPHORES CREES*****\n");


    /*positionnement de la taille de la memoire partagee*/
    ret_val = ftruncate (shm_etage1, sizeof(struct transport));
    if(ret_val == -1)
    perror("\nftruncate etage 1 failled:");
    /*mapping de la zone*/
    shm_ptr1 = mmap ( 0, sizeof(struct transport), PROT_WRITE|PROT_READ, MAP_SHARED, shm_etage1, 0 );
    if(ret_val == -1)
    perror("\nmmap etage 1 failled:");
    /*casting du pointeur d'adresse*/
    struct transport* transp_shm_ptr1 = (struct transport*) shm_ptr1;

    while(trajet.NB_pass != -1)
    {
    /*lecture du tube*/
    read(lire,(char*) &trajet,sizeof(struct transport));
    printf("\nTrajet %d : %d passagers vont de l'etage %d a l'etage %d", t++, trajet.NB_pass, trajet.actuel, trajet.dest);
    /*BLOQUAGE ACCES MEMOIRE -->EVITER VIOLATION DE PARTAGE */
    ret_val = sem_wait ( ptr_sema ) ;
    if ( ret_val == -1 )
    { perror ( "\n\rMAIN : sem_wait failed !!!" ); }

    /*ecrire en memoire*/
    *transp_shm_ptr1 = trajet;

    /*DEBLOQUAGE ACCES MEMOIRE*/
    ret_val = sem_post ( ptr_sema ) ;
    if ( ret_val == -1 )
    { perror ( "\n\rMAIN : sem_post failed !!!" ); }
    /*VALIDATION POUR SYNCHRO PROCESSUS*/
    ret_val = sem_post ( ptr_sema2) ;
    if ( ret_val == -1 )
    { perror ( "\n\rMAIN : sem_post failed !!!" ); }




    //sleep(4);


    }

    /*FERMETURE SEMAPHORE*/
    ret_val = sem_close (ptr_sema);
    if (ret_val == -1)
    { perror ("\n\rMAIN : sem_close failed !!!"); }
    /*DESTRUCTION SEMAPHORE*/
    ret_val = sem_unlink (semname1);
    if (ret_val == -1)
    { perror ("\n\rMAIN : sem_unlink failed !!!"); }
    printf("\n\r*****Fermeture et destruction de /tmp/semapm*****\n");

    ret_val = sem_close (ptr_sema2);
    if (ret_val == -1)
    { perror ("\n\rMAIN : sem_close failed !!!"); }

    ret_val = sem_unlink (semname2);
    if (ret_val == -1)
    { perror ("\n\rMAIN : sem_unlink failed !!!"); }
    printf("\n\r*****Fermeture et destruction de /tmp/semapn*****\n");


    printf("\nFIN PROGRAMME");
    /*de-mapping de la memoire*/
    ret_val = munmap ( shm_ptr1 , sizeof(struct transport) );
    /*fermeture memoire partagee*/
    ret_val = close ( shm_etage1 );
    /*destruction objet memoire*/
    ret_val = shm_unlink ( "/tmp/etage1" );
    }


    code PS3



    #include <sys/types.h>
    #include <sys/mman.h>
    #include <sys/stat.h>
    #include <sys/fcntl.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <signal.h>
    #include <semaphore.h>
    #include <sys/mode.h>

    struct ascenceur
    {
    int id;
    int charge;
    int portes;
    int NB_in;
    int NB_max;
    int dest;
    };

    struct etage
    {
    int id;
    int occupation;
    int asc_stop;
    };

    struct transport
    {
    int actuel ;
    int dest ;
    int NB_pass;
    };

    /*____________________________________DECLARATIONS POUR SEMAPHORES NOMMES_____________*/
    sem_t *ptr_sema=NULL ;
    sem_t *ptr_sema2=NULL;
    int oflags = O_CREAT ;
    mode_t mode = 0644 ;
    const char semname1 [] = "/tmp/semapn" ;
    const char semname2 [] = "/tmp/semapm" ;
    unsigned int value = 0 ;
    int ret_val ;


    /*___________________________________DECLARATIONS POUR MEMOIRE PARTAGEE GLOBLALE_____*/
    int shm_etage1;
    int shm_etage2;
    caddr_t shm_ptr1;


    main (int argc, char *argv[])
    {
    struct transport* transp_shm_ptr1;
    struct transport trajet;
    trajet.actuel=0;
    trajet.dest=0;
    trajet.NB_pass=0;

    printf("\n\t\tSUPERVISION");
    printf("\n\t\t***********");

    // sleep(4);

    /*ouverture de la memoire partagee*/
    shm_etage1 = shm_open ( "/tmp/etage1", ( O_RDWR), 0 );
    if(shm_etage1 == -1)
    perror("\nopen etage 1 failled:");
    printf("\nmem ouverte");
    sleep(2);
    /*mapping de la memoire*/
    shm_ptr1=mmap(0,sizeof(struct transport),PROT_READ,MAP_SHARED,shm_etage1,0);
    if(ret_val == -1)
    perror("\nmmap etage 1 failled:");
    printf("\nmem mappee");
    /*casting du pointeur d'adresse*/
    transp_shm_ptr1=(struct transport*) shm_ptr1;
    /*OUVERTURE SEMAPHORE NOMME*/
    ptr_sema = sem_open ( semname1, oflags, mode, value );
    if ( ptr_sema == (void *) -1 )
    {perror ( "\n\rMAIN : sem_open failed !!!" );
    exit(1);}
    printf("\nsem1 ouvert");
    /*OUVERTURE DU SEMAPHORE NOMME DE SYNCHRONISATION*/
    ptr_sema2 = sem_open ( semname2, oflags, mode, value );
    if ( ptr_sema == (void *) -1 )
    {perror ( "\n\rMAIN : sem_open failed !!!" );
    exit(1);}
    printf("\nsem2 ouvert");
    while(transp_shm_ptr1->NB_pass != -1)
    {
    printf("\nDans boucle");
    /*ESSAIS DE LECTURE SANS BLOQUAGE*/
    ret_val = sem_trywait ( ptr_sema2 ) ;
    printf("\nsem try wait");
    /*BLOQUAGE ACCES MEMOIRE-->POUR EVITER VIOLATION DE PARTAGE*/
    ret_val = sem_wait ( ptr_sema ) ;
    if ( ret_val == -1 )
    { perror ( "\n\rMAIN : sem_wait failed sem_mem (PTR_SEMA)!!!" ); }
    printf("\nsem wait");
    /*lecture de la memoire champ a champ*/
    trajet.actuel=transp_shm_ptr1->actuel;
    trajet.dest = transp_shm_ptr1->dest;
    trajet.NB_pass = transp_shm_ptr1->NB_pass;


    printf("\nactuel %d, dest %d, nbpass %d", trajet.actuel, trajet.dest, trajet.NB_pass);
    /*DEBLOQUAGE ACCES MEMOIRE*/
    ret_val = sem_post ( ptr_sema ) ;
    if ( ret_val == -1 )
    { perror ( "\n\rMAIN: sem_post failed sem_mem for PTR_SEMA!!!" ); }

    }/*fin while*/


    //sleep(4);

    /*FERMETURE SEMAPHORE*/
    ret_val = sem_close (ptr_sema);
    if (ret_val == -1)
    { perror ("\n\rMAIN : sem_close failed !!!"); }


    ret_val = sem_close (ptr_sema2);
    if (ret_val == -1)
    { perror ("\n\rMAIN : sem_close failed !!!"); }



    /*de mapping de la memoire partagee*/
    ret_val = munmap ( shm_ptr1 , sizeof(struct transport) );
    if (ret_val == -1)
    { perror ("\n\rMAIN : munmap failed !!!"); }
    /*fermeture de la memoire*/
    ret_val = close ( shm_etage1 );
    if (ret_val == -1)
    { perror ("\n\rMAIN : close failed !!!"); }

    }


    Merci pour les conseils