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 :

Liste en Memoire partagée


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Liste en Memoire partagée
    Bonjour à tous et joyeux noel
    Voici mon probleme: j'ai une liste chainée qui servira à contenir des entiers qui seront le nom des fichiers à imprimer
    Je dois donc faire un spooler mais je bloque sur le partage de ma liste chainée.
    Je voudrais juste savoir comment faire pour que mon pere et mon fils modifie et accède à la meme liste.
    Pas besoin de me parler de semaphore et d'exclusion mutuel, c'est juste la mise en partage qui m'importe.
    Alors voici mon code allégé sans sémaphore etc:


    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
    int main ()
    {	
    	int mem;
    	int err;
    	sll_s *liste = NULL;
    	int val;
     
       /* creation du segment ( N case ) */
       mem = shmget(IPC_PRIVATE, 10*sizeof(sll_s*), IPC_CREAT | 0666);
     
       /* attachement */
    /* surement une erreur si dessous */
    	liste = shmat(mem, NULL, 0);
    	liste = sll_new();
     
    	/* producteur -> ajoute les noms des fichiers a la liste */
    	if(fork() > 0){
    			sll_insert (liste, 18346);
    	}else{
    			sll_first(liste);
    			val = sll_data (liste);
    /* forcement j'obtiens rien, il considere ma liste vide */
    			printf("on recupere bien : %i\n", val);	
    	}
     
     
       return EXIT_SUCCESS;
    }

    merci d'avance

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 384
    Points : 23 679
    Points
    23 679
    Par défaut
    Il nous manque le code des fonctions « sll_ » mais, à vue de nez, il y a tout de suite quelque chose qui cloche : d'abord, tu ne vérifies jamais si tes fonctions d'allocation de mémoire ont réussi ou échoué. Ensuite :

    Citation Envoyé par tereo Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    /* surement une erreur si dessous */
    	liste = shmat(mem, NULL, 0);
    	liste = sll_new();
    En effet : tu récupères l'adresse du segment de mémoire partagée dans « liste » et tu écrases cette adresse tout de suite après par la valeur de retour de ssl_new(). Ton segment de mémoire partagée est donc perdu. D'autre part, je suppose que ssl_new() doit créer une liste dans cet espace. Il faut donc lui préciser en paramètre, sinon elle ne pourra pas deviner d'elle-même où il se trouve.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Bon voila ce que je viens de bidouiller sans succés:

    Avant le fork
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       /* creation du segment ( N case ) */
       mem = shmget(IPC_PRIVATE, sizeof(sll_s*), IPC_CREAT | 0666);
    if(mem == -1 )
       perror("erreur lors de la creation du segment");
    Dans le fork
    le pere:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                    liste = shmat(mem, NULL, 0);   
                    sll_new2(liste);
                    sll_insert (liste, 18346);
                    sll_insert (liste, 18347);
                   shmdt(liste);
    le fils
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                 liste = shmat(mem, NULL, 0);           
                sll_first(liste);
                val = sll_data (liste);
                printf("on recupere bien : %i\n", val);   
          shmdt(liste);
    Le fils bloque au moment de recuperer la premiere valeur avec le sll_first

    Donc j'ai modifié ici le sll_new en sll_new2 de la maniere suivant:
    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
     
    void *sll_new2 (sll_s *p_sll)
    {
          item_s *p_l = malloc (sizeof *p_l);
     
          if (p_l)
          {
             p_l->data = 0;
             p_l->next = NULL;
     
             p_sll->p_start = p_l;
             p_sll->list = NULL;
          }
          else
          {
             fprintf (stderr, "Memoire insufisante\n");
             exit (EXIT_FAILURE);
          }
    }

Discussions similaires

  1. C-System : Memoire partagée et Liste chainée
    Par agrosjea dans le forum C
    Réponses: 3
    Dernier message: 18/06/2008, 09h58
  2. Utilisation de la memoire partage
    Par Treuze dans le forum C
    Réponses: 11
    Dernier message: 23/05/2006, 14h45
  3. segment de memoire partagé en C
    Par thierry_b dans le forum C
    Réponses: 2
    Dernier message: 29/11/2005, 21h30
  4. [segment de memoire partagée]
    Par pitit777 dans le forum C
    Réponses: 4
    Dernier message: 26/11/2005, 14h47
  5. Réponses: 13
    Dernier message: 05/05/2004, 19h09

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