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 :

La mémoire partagée


Sujet :

C

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    En recherche d’emploi
    Inscrit en
    Février 2014
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : En recherche d’emploi

    Informations forums :
    Inscription : Février 2014
    Messages : 62
    Points : 36
    Points
    36
    Par défaut La mémoire partagée
    Bonjour,

    Voilà mon problème et merci à ceux qui me répondront :
    Je dois faire un programme en c utilisant des sémaphores pour synchroniser l'affichage alternée à l'écran de 2 processus.

    Donc si j'ai bien compris :
    Les sémaphores doit protéger l'accès à l'écran.
    La ressource partagée est dans ce cas l'écran.

    Pour le partage d'un segment de mémoire, le processus père créer le segment de mémoire ensuite pour accéder à ce segment tous processus doit s'y attacher et se détacher après. Enfin le processus créateur du segment le détruira.

    Maintenant si je veux par exemple créer un segment de mémoire partagée contenant un entier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            int *cpt;
            ...
    	// Création de segment mémoire patagée
    	if((idshm = shmget(cle, sizeof(int), IPC_CREAT | 0666)) == -1)
    		die("shmget");
     
    	// Attachement
    	if((cpt = (int *) shmat(idshm, NULL, 0)) == NULL)	// Renvoie l'@ du segment partagé attacher
    		die("shmat");
            ...
    Les processus accèdent à la ressource partagée en utilisant *cpt.

    Ma question est comment créer une ressource partagée qui est l'écran?

    Merci.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 678
    Points : 30 965
    Points
    30 965
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Revaroa Voir le message
    Maintenant si je veux par exemple créer un segment de mémoire partagée contenant un entier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            int *cpt;
            ...
    	// Création de segment mémoire patagée
    	if((idshm = shmget(cle, sizeof(int), IPC_CREAT | 0666)) == -1)
    		die("shmget");
     
    	// Attachement
    	if((cpt = (int *) shmat(idshm, NULL, 0)) == NULL)	// Renvoie l'@ du segment partagé attacher
    		die("shmat");
            ...
    Les processus accèdent à la ressource partagée en utilisant *cpt.
    Bonjour

    C'est tout à fait ça. Mais tu peux aussi créer des segments plus gros si tu veux. Si par exemple tu crées un segment de 20 int, tu peux alors accéder à cpt[0] jusqu'à cpt[19]. Tout comme un malloc.
    Et si tous les processus qui accèdent à ta ressource (sémaphore, mémoire) sont tous fils d'un procesuss principal, alors tu peux créer ta ressource dans le processus principal en utilisant IPC_PRIVATE comme clef. Ta ressource sera alors confinée au processus principal mais tous les fork() y auront accès. Ca évite de se coltiner les ftok() pour générer des n° de clefs. Accessoirement le 0666 n'est pas figé. T'as tout à fait le droit d'affiner des droits plus restrictifs en fonction de qui doit accèder à la zone...

    Citation Envoyé par Revaroa Voir le message
    Ma question est comment créer une ressource partagée qui est l'écran?
    Ben tu crées une zone de mémoire partagée "représentant" l'écran !!!
    Si par exemple t'as un écran de 800x600, alors tu crées une zone de mémoire partagée de 800x600 chars. Ensuite tu charges un processus spécial d'écrire à l'écran les infos qui sont dans la mémoire. Ce processus peut par exemple avoir une copie interne de la zone mémoire partagée. Ensuite, chaque fois qu'il a accès à la zone (donc chaque fois que le sémaphore le laisse entrer), il compare la zone avec sa zone. Et s'il y a une différence alors il la reporte sur l'écran puis met à jour sa zone...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    En recherche d’emploi
    Inscrit en
    Février 2014
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : En recherche d’emploi

    Informations forums :
    Inscription : Février 2014
    Messages : 62
    Points : 36
    Points
    36
    Par défaut
    Bonjour,

    Merci pour ta réponse.

Discussions similaires

  1. mémoire partagée ?
    Par youp_db dans le forum C
    Réponses: 1
    Dernier message: 18/05/2006, 15h54
  2. Sémaphores et Mémoires partagées
    Par Sensib dans le forum C++
    Réponses: 3
    Dernier message: 19/03/2006, 18h14
  3. Réponses: 17
    Dernier message: 02/02/2006, 12h03
  4. création d'objet en mémoire partagé
    Par BigNic dans le forum C++
    Réponses: 6
    Dernier message: 28/11/2005, 18h41
  5. [CR][paradox] mémoire partagée disponible insuffisante !
    Par AGT dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 24/03/2004, 14h27

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