IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

sémaphores et segments de mémoire


Sujet :

Linux

  1. #1
    Candidat au Club
    Inscrit en
    Février 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Points : 3
    Points
    3
    Par défaut sémaphores et segments de mémoire
    bonjour, j'essaie de mettre en place un petit code qui permet a un script "ecrivain" d'écrire un message dans un segment de mémoire, qui attend qu'un script "lecteur" vienne lire le message et permette alors a l'écrivain de se fermer. Ceci est géré a l'aide de 2 sémaphores.

    J'exécute le code ecrivain (apres une compilation avec cc en sh) en tâche de fond. Puis je lance le lecteur.

    L'écrivain écrit bien dans le segment, le lecteur lis bien le segment et s'exécute bien jusqu'au bout mais ne redonne pas la main a l'écrivain qui ne se termine pas. J'aimerai un conseil, je pense que le probleme se situe au niveau du pointage sur le sémaphore qui permet la mise en attente mais je n'arrive pas a le cerner.

    D'avance merci.

    Voici les 2 scripts.


    ecrivain :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <sys/sem.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    #define CLEF 665
    #define LONGUEUR_SEGMENT 512
     
     
    int main (int argc, char *argv[])
    {
    int semaphores;
    int memoirePartagee;
    struct sembuf manipSemaphores[2];
    char *attacheMoi;
     
    if ((memoirePartagee=shmget (CLEF, LONGUEUR_SEGMENT, IPC_CREAT|0666)) == -1)
    {
      puts("impossible de creer le segment de memoire partagee");
      exit (1);
    }
     
    if ((semaphores=semget(CLEF,2,IPC_CREAT|0666)) == -1)
    {
      puts("impossible de créer les sempahores");
      exit(1);
    }
    /* les deux semaphores sont initialisées en meme temps */
     
    manipSemaphores[0].sem_num=0;
    manipSemaphores[0].sem_op=1;
     
    manipSemaphores[1].sem_num=1;
    manipSemaphores[1].sem_op=1;
     
    semop(semaphores, manipSemaphores,2);
     
    /*Operation P(1) sur le 1er semaphore => prise de ressource sur la memoire partagée */
     
    manipSemaphores[0].sem_num=0;
    manipSemaphores[0].sem_op=-1;
     
    semop(semaphores,manipSemaphores, 1);
    puts("je prends de la ressource");fflush(stdout);
     
    /* attachement du segment a une adresse choisie par le système */
     
    attacheMoi=shmat(memoirePartagee,NULL, 0);
    if ((int)(attacheMoi)==-1)
    {
      puts("impossible d'attacher le segment !");
      exit(1);
    }
    else
    {
      printf("Adresse de l'attachement : %p \n",attacheMoi);
      strcpy(attacheMoi, "Message a l'adresse de l'autre processus !");
      shmdt(attacheMoi);
     
    /* Operation V(1) sur le premier semaphore => liberation de la ressource de memoire partagee */
     
    manipSemaphores[0].sem_num=0;
    manipSemaphores[0].sem_op=1;
    semop(semaphores, manipSemaphores,1);
    }
    puts("Attente de l'autre processus ");fflush(stdout);
     
    /* arret de l'écrivain ICI, il ne repart pas */
     
    /* Operation Z sur le second semaphore */
     
    manipSemaphores[0].sem_num=1;
    manipSemaphores[0].sem_op=0;
    semop(semaphores, manipSemaphores,1);
     
    puts ("Debloque !");
    fflush(stdout);
     
    /*Suppression des IPCs */
     
    semctl(semaphores,0,IPC_RMID);
    shmctl(memoirePartagee,IPC_RMID,0);
     
    return 0;

    lecteur:
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <sys/sem.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    /*processus lecteur */
     
    #define CLEF 665
    #define LONGUEUR_SEGMENT 512
     
    int main(int argc, char *argv[])
    {
    int semaphores;
    int memoirePartagee;
    struct sembuf manipSemaphores;
    char *attacheMoi;
     
    if ((memoirePartagee=shmget(CLEF,LONGUEUR_SEGMENT,0600)) == -1)
    {
      puts ("Impossible d'acceder au segment de memoire partagée");
      exit(1);
    }
     
    if (( semaphores=semget(CLEF,2,0600)) == -1)
    {
      puts ("Impossible d'acceder aux semaphores ");
      exit(1);
    }
     
    /* Operation P(1) => on demande à accéder a la ressource */
     
    manipSemaphores.sem_num=0;
    manipSemaphores.sem_op=-1;
     
    semop(semaphores, &manipSemaphores,1);
    puts("Je demande a acceder a la ressource ");fflush(stdout);
     
    attacheMoi=shmat(memoirePartagee,NULL,0);  /*attachement de memoire partagee)*/
     
    if ((int)(attacheMoi)==-1)
    {
    puts ("impossible d'attacher !");
      exit(1);
    }
    else
    {
      printf("Adresse de l'attachement: %p \n",attacheMoi);
      puts("Contenu de la memoire a l'attachement");
      puts(attacheMoi);
      shmdt(attacheMoi);
      manipSemaphores.sem_num=0;
      manipSemaphores.sem_op=1;
      semop(semaphores,&manipSemaphores,1);
    }
     
    puts("Deblocage de l'autre processus ");
    fflush(stdout);
     
    /* Debloquer le semaphore en attente se fait a l'aide d'une operation prise de ressource P(1) car la v
    aleur courante de celui-ci est de 1*/
     
    manipSemaphores.sem_num=1;
    manipSemaphores.sem_op=-1;
    semop(semaphores,&manipSemaphores,1);
     
    puts("fin de traitement de lecteur");
    fflush(stdout);
     
    return 0;
    }

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    sa fontionne tres bien ton truc ......... l'ecrivain rend bien la main !
    alors ???????

  3. #3
    Candidat au Club
    Inscrit en
    Février 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    oui l'ecrivain rend bien la main mais il ne la reprend pas quand le lecteur a fini son travail pour éliminer les ipc qui ont été créées. (marqué dans le script en commentaire coté écrivain).
    En gros je voudrais que le lecteur rende la main a l'écrivain une fois qu'il a lu.

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    bin pour que l'ecrivain face le "menage" il lui faut savoir que le lecteur a lut.....
    la plusiquer solution peuvent être mises en places, selon le but final.

    simple : le lecteur "écrit" le sémaphore, indiquant a l'écrivain en attente sa lecture.

    - simple, un 2eme sémaphore indiquant l'action lecture

    .......

  5. #5
    Candidat au Club
    Inscrit en
    Février 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    ok, je vais me pencher la dessus.

Discussions similaires

  1. Segment de mémoire partagé
    Par dedibox26 dans le forum Débuter
    Réponses: 3
    Dernier message: 13/05/2010, 01h18
  2. [SHM] shmget crée uniquement des segments de mémoire partagée privée
    Par prgasp77 dans le forum Administration système
    Réponses: 1
    Dernier message: 23/09/2009, 09h20
  3. Réponses: 4
    Dernier message: 14/05/2009, 21h22
  4. Remplir un segment de mémoire
    Par redanovich dans le forum POSIX
    Réponses: 18
    Dernier message: 22/06/2008, 22h14
  5. Allouer un segment de mémoire avec "GNU GCC Compiler&qu
    Par damien99 dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 23/06/2006, 00h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo