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

Eclipse C & C++ Discussion :

cygwin et CLES segment de mémoire


Sujet :

Eclipse C & C++

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 238
    Points : 95
    Points
    95
    Par défaut cygwin et CLES segment de mémoire
    Bonjour

    Mon problème :
    Je ne sais pas si cygwin gère bien les clés de segment mémoire ?
    Ou alors dois je mettre tout mon espace de travail d'eclipse dans /home de cygwin pour qu'il puisse gérer les clés ?

    Je précise que le code fonctionne sous linux avec console ou sous eclipse en changeant évidemment les chemins des fichiers lecteur/redacteur!

    Voici mon code en entier puis là où ça bloque une fois exécuté sous eclipse :
    Code : 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
     
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <sys/sem.h>
     
    #define CLE 253
    #define CLES 300
     
    int main()
    {
    int shmid, semid, i;
    char *mem=0;
    int status, rc;
    struct shmid_ds shmid_struct;
     
    pid_t lecteur, redacteur;
     
    shmid=shmget((key_t)CLE,1000,0750 |IPC_CREAT | IPC_EXCL);
     
    mem=shmat(shmid,mem,0);
    if(mem == (char*) -1) {
    printf("\nShmat failed, erreur alloc memoire \n");
    return(0);
    }
     
    *mem= 0;
    *(mem+ 4) = 0;
     
    semid= semget(CLES, 2, IPC_CREAT|IPC_EXCL|0600);
     
    semctl(semid, 0, SETVAL, 1);
    semctl(semid, 1, SETVAL, 1);
     
    i = 0;
     for (i=0;i <3;i++) {
          lecteur= fork();
          if (lecteur== 0) {
             execl("C:\workspace\workspace_c\lecteur\Debug\lecteur.exe", "C:\workspace\workspace_c\lecteur\Debug\lecteur.exe", NULL);
          }
          else{
               redacteur= fork();
               if (redacteur== 0)
                  execl("C:\workspace\workspace_c\redacteur\Debug\redacteur.exe", "C:\workspace\workspace_c\redacteur\Debug\redacteur.exe", NULL);
          }
      }
    wait(&status);
     
        rc = shmctl(shmid, IPC_RMID, &shmid_struct);
        if (rc==-1)
          {
            printf("main: shmctl() failed\n");
            return -1;
          }
     
        rc = shmdt(mem);
        if (rc==-1)
          {
            printf("main: shmdt() failed\n");
            return -1;
          }
     
          rc = semctl( semid, 2, IPC_RMID );
        if (rc==-1)
          {
            printf("main: semctl() remove id failed\n");
            return -1;
          }
     
    return 0;
     }
    Je ne passe pas cette partie du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    shmid=shmget((key_t)CLE,1000,0750 |IPC_CREAT | IPC_EXCL);
     
    mem=shmat(shmid,mem,0);
    if(mem == (char*) -1) {
    printf("\nShmat failed, erreur alloc memoire \n");
    return(0);
    }
    Merci à vous d'avance de vos remarques et conseils avisées

  2. #2
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 238
    Points : 95
    Points
    95
    Par défaut
    bref

    comment utiliser avec cygwin pour les segments de mémoire, mémoires partagés,... quand on code sous windows/eclipse ?

    y'a peut-être un ligne de code à entrer dans le terminal cygwin ? J'ai d'ailleurs mis tout mon espace de travail C dans le /home du répertoire de cygwin car je pensais que ça pouvait venir de là mais sans succès !

    j'ai cherché sur google mais je n'ai pas encore trouvé d'explication claire.
    Apparemment ça n'a pas l'air simple sous cygwin pour la création de processus, signaux, socket,... C'est peut-être ça qui pose problème ?
    http://pipeline.lbl.gov/code/3rd_par...in-ug-net.html

    Comme j'ai qu'une machine virtuelle linux fedora pour utiliser linux pour l'instant, je vais retourner dessus

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 238
    Points : 95
    Points
    95
    Par défaut
    il me manquait à lancer dans la console de cygwin
    /usr/sbin/cygserver.exe &

    et

    En C échapper le \ pour qu'il soit interprété correctement car il sert lui même de caractère d'échappement: donc tu dois mettre \\.

    sinon

    le code tourne mais cygwin ou eclipse et windows (ce qui est plus logique puisque c'est l'os qui va gérer les processus) me génère des fichiers du type :
    lecteur.exe.stackdump
    redacteur.exe.stackdump
    qui me donne les pid des fork lecteur et redacteur, une info que je n'ai pas sous linux directement dans eclipse !

    De plus j'avais en plus oublié que sous linux les chemins sont marqués par des '/' et non des '\' comme sous win

    Par contre pour une fois : windows est plus fort que linux car linux gère les préemptions il y a donc un entrelacement des processus dans la console.
    Et donc des affichages dans la console que se partagent les programmes redacteur et lecteur qui ne correspondent pas parfois à la réalité du code.
    Car redacteur doit écrire et lecteur si y'a rien dans la zone mémoire il n'affiche rien or là si le redacteur n'a pas fini d'écrire linux préempte le lecteur et affiche son dernier contenu !!!

    Je marque résolu mais si vous avez des commentaires sur cette histoire d'entrelacement je regarderais.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [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, 08h20
  2. Réponses: 4
    Dernier message: 14/05/2009, 20h22
  3. Remplir un segment de mémoire
    Par redanovich dans le forum POSIX
    Réponses: 18
    Dernier message: 22/06/2008, 21h14
  4. sémaphores et segments de mémoire
    Par djed2 dans le forum Linux
    Réponses: 4
    Dernier message: 21/03/2007, 10h44
  5. Allouer un segment de mémoire avec "GNU GCC Compiler&qu
    Par damien99 dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 22/06/2006, 23h18

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