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

C Discussion :

Question sur un exemple de partage de mémoire


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 60
    Par défaut Question sur un exemple de partage de mémoire
    Bonjour,

    Donc je suis en train d'étudier le partage de mémoire, mon prof a donné un exemple mais je n'arrive pas à la compiler.

    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
    #include <sys/mman.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <sys/types.h>
    #include <stdlib.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #define SHM_AREA_NAME "/shmarea"
    #define MYSHMSIZE 4096
    void *	shm_area;
    char	shm_addr[32];
    int	shm_descr;
     
    shm_descr = shm_open(SHM_AREA_NAME, O_CREAT|O_RDWR, 666);
    if (ftruncate(shm_descr, MYSHMSIZE) < 0)
    	perror("ftruncate");
     
    if ((shm_area = mmap(0, MYSHMSIZE, PROT_READ|PROT_WRITE, MAP_SHARED, shm_descr, (long)0)) == NULL)
    	perror("mmap");
     
    //conversion de l'adresse
    sprintf(shm_addr, "%d", (unsigned long)shm_area);
     
    close(shm_descr); //ne sert plus
     
    if (!fork())
    	execlp(CHILD_PROCESS_PATH, CHILD_PROCESS_PATH, shm_addr, NULL);
     
     
    int main(int argc, char **argv){
    	void *shm_area;
     
    	shm_area = (void *)atol(argv[1]);
    	shm_descr = shm_open(SHM_AREA_NAME, O_RDWR, 666);
    	if (shm_descr == -1)
    		perror("shm_open");
     
    	if (mmap(shm_area, MYSHMSIZE, PROT_READ|PROT_WRITE, MAP_SHARED, shm_descr, (long)0) != shm_area)
    		perror("mmap fils");
    	close(shm_descr);
    }
    J'ai notamment comme erreur :
    ex2.c:14: attention : la définition de données n'a pas de type ni de classe de stockage
    ex2.c:14: erreur: un élément de l'initialisation n'est pas une constante


    Sinon je ne comprend pas trop comment fonctionne le execlp dans ce cas. Pourquoi le CHILD_PROCESS_PATH ? Par quoi faut il le remplacer ? J'ai lu dans le man qu'il fallait mettre le nom du programme a lancer, or dans ce cas on veut transmettre l'adresse de la zone partagée au processus fils donc je ne vois pas quoi mettre..

    Pouvez vous éclairer ma lanterne ?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ça compile, ça ?
    La moitié du code est à l'extérieur de toute fonction...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Ca compile pas ca, ton prof doit reprendre des cours de C A moins tu as modifié le code auquel cas c'est à toi d'en reprendre

    Toute cette partie est à mettre dans une fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    shm_descr = shm_open(SHM_AREA_NAME, O_CREAT|O_RDWR, 666);
    if (ftruncate(shm_descr, MYSHMSIZE) < 0)
    	perror("ftruncate");
     
    if ((shm_area = mmap(0, MYSHMSIZE, PROT_READ|PROT_WRITE, MAP_SHARED, shm_descr, (long)0)) == NULL)
    	perror("mmap");
     
    //conversion de l'adresse
    sprintf(shm_addr, "%d", (unsigned long)shm_area);
     
    close(shm_descr); //ne sert plus
     
    if (!fork())
    	execlp(CHILD_PROCESS_PATH, CHILD_PROCESS_PATH, shm_addr, NULL);
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2004
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 60
    Par défaut
    oui je l'ai recopié texto de la feuille, mais lorsque je l'ai compilé j'avais mis cette partie dans le main, la ca ne compilait pascar il faut donner une valeur a CHILD_PROCESS_PATH mais je ne sais pas laquelle ..

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ben, le chemin d'accès de ton exécutable
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/10/2014, 15h00
  2. [POO] Attribut et fonction : question sur un exemple
    Par shinyfabio dans le forum Général Python
    Réponses: 4
    Dernier message: 07/03/2012, 09h35
  3. Réponses: 0
    Dernier message: 06/05/2010, 18h34
  4. Réponses: 9
    Dernier message: 17/03/2007, 05h49
  5. Quelques questions sur la mémoire
    Par Gruik dans le forum C
    Réponses: 6
    Dernier message: 17/11/2004, 14h38

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