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

POSIX C Discussion :

Question sur les variables dans les processus


Sujet :

POSIX C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 130
    Points : 80
    Points
    80
    Par défaut Question sur les variables dans les processus
    Bonjour,
    j'ai une question sur la nécessité d'avoir une mémoire partagé dans la traduction d'un algo vers le code en langage C. Dans mon algo j'utilise une variable nb_lect entourée de sémaphore pour la protéger, ma question est ai-je besoin de faire une mémoire partagé ou est ce que la protection par sémaphore (exclusion mutuelle) est suffisante ?

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par amateurc Voir le message
    j'ai une question sur la nécessité d'avoir une mémoire partagé dans la traduction d'un algo vers le code en langage C. Dans mon algo j'utilise une variable nb_lect entourée de sémaphore pour la protéger, ma question est ai-je besoin de faire une mémoire partagé ou est ce que la protection par sémaphore (exclusion mutuelle) est suffisante ?
    J'ai rien compris. Tu as combien de processus ?
    Où est définit nb_lect ? Quelle est sa portée ?
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 130
    Points : 80
    Points
    80
    Par défaut
    j'ai 2 processus un lecteur et un redacteur, nblect est définie en variable globale, elle est visible dans tout le programme par toutes les fonctions en fait voici mes déclarations
    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
     
    #include "lib.h" //contient les fonctions sur les sémaphorec avec les includes
     
    #define cle 123
     
    #define tmp_consult 2
    #define tmp_modif 3
     
    #define nb_lect 5
    #define nb_red 10
     
    //les processus
    void lecteur();
    void ecrivain();
     
    //variable
    int nb_lect_en_cours=0;
     
    //pour les semaphores
    int X, SL, S; // X,SL initialisé à 1 et S à 0
    nb_lect_en_cours est entouré par le semaphore SL de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    P(SL);
    nb_lect_en_cours++;
    V(SL);

  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Si tes deux processus doivent accéder à la même variable, il faut la placer en mémoire partagée.

    Le sémaphore n'a rien à voir la dedans. Le sémaphore sert simplement à sérialiser les accès à la mémoire partagée. Il ne rend pas ta variable accessible des deux processes.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 130
    Points : 80
    Points
    80
    Par défaut
    en fait je n'ai que le processus lecteur qui accède a la variable mais plusieurs fois avec une boucle for() donc est ce que je dois quand même utiliser la mémoire partagée ? ou est ce que je ne dois l'utiliser que quand 2 processus distinct utilise une même variable ?

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par amateurc Voir le message
    en fait je n'ai que le processus lecteur qui accède a la variable mais plusieurs fois avec une boucle for() donc est ce que je dois quand même utiliser la mémoire partagée ? ou est ce que je ne dois l'utiliser que quand 2 processus distinct utilise une même variable ?
    Une variable lue que personne n'écrit n'est pas d'une grande utilisé. Ca pourrait être une constante ou une variable à lecture seule...
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Vu son nom, j'avais cru comprendre que cette variable contenait le nombre de lecteurs. Maintenant tu nous dit que tu n'as qu'un lecteur, et qu'en plus il ne fait que lire la variable. Donc, à quoi te sert cette variable ?

    Mais sinon oui, effectivement, tu ne met en mémoire partagé que ce qui doit être accédé par plusieurs processus différents. C'est pour ça que ça s'appelle mémoire partagée.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 130
    Points : 80
    Points
    80
    Par défaut
    d'accord merci de votre aide

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 130
    Points : 80
    Points
    80
    Par défaut
    j'ai encore une question mais cette fois ci sur l'attente avec la commande sleep donc c'est une simple attente que je veux faire pas de synchronisation. donc voici mon code
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    #include <unistd.h>
     
    #define nb0 5
    #define nb1 10
     
    int main() 
    {
    	int id0, id1;	
    	int it0, it1;
     
    	for(it0=1;it0<=nb0;it0++)
    	{
    		if ((id0=fork())==-1)
    		{
    			perror("Problème création processus p0");
    			exit(-1);
    		}
    		else
    		{
    			if (id0==0)
    			{
    				int tmp0=5;
     
    				printf("Ici le fils processus1 de pid : %d qui \033[33mfait action 1\033[0m la ressource attente %d secondes", getpid(), tmp0);
    				if (sleep(tmp0 != 0))
    					perror("sleep");
     
    				puts("Fin d'attente");
     
    				exit(0);
    			}
    		}
    	}
     
    	for(it1=1;it1<=nb1;it1++)
    	{
    		if ((id1=fork())==-1)
    		{
    			perror("Problème création processus p1");
    			exit(-2);
    		}
    		else
    		{
    			if (id1==0)
    			{
    				int tmp1=5;
     
    					printf("Ici le fils processus2 de pid : %d qui \033[31mfait action 2\033[0m la ressource attente %d", getpid(), tmp1);
    					if (sleep(tmp1 != 0))
    						perror("sleep");
    					puts("Fin d'attente");
     
    				exit(0);
    			}
    		}
    	}
     
    	return 0;
    }
    compilé avec gcc test.c -o test -Wall -W -pedantic-errors

    Lors de l'exécution de ce programme tout ce passe correctement ... sauf l'attente alors que le perror n'indique rien alors je lance mon programme de cette façon :
    résultat les processus sont bien créé mais l'attente ne se fait pas : tout est affiché d'un coup. après j'ai fait ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $ ./test; ps -e; sleep 1; ps -e
    le premier ps indique bien tous les processus test créés et dans le 2ème il n'existe plus alors que le sleep dure plus de 2 secondes dans tous les processus.
    Bref savez-vous d'où peux venir cette erreur ?

  10. #10
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Ton fils attend 1 seconde, pas 5, puisque (tmp1 != 0) vaut 1.

    D'autre part il faut que dans le père tu attende le fils avec un wait(). Sinon le père va terminer, envoyer un sighup au fils, qui va lui aussi terminer sur réception du signal. J'imagine que dans ton exemple le "Fin d'attente" ne s'affiche jamais ? C'est parce que le fils meure avant.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 130
    Points : 80
    Points
    80
    Par défaut
    Je ne peux que vous remercier pour votre aide sur le wait (après tout mon prof n'avait pas compris d'où venait le problème ...) en revanche je ne comprends pas pourquoi vous dites :
    Ton fils attend 1 seconde, pas 5, puisque (tmp1 != 0) vaut 1.
    Sur le net j'ai trouvé ceci
    sleep() renvoie zéro si le temps prévu s'est écoulé, ou le nombre de secondes restantes si un signal a réveillé le processus.
    donc si sleep(x)==0 le temps c'est bien écoulé et si c'est différent je l'indique via le perror. Donc je ne comprends pas trop ce que vous voulez dire.

    Edit :
    je viens de comprendre ce que vous vouliez dire. En effet mon temps d'attente était de 1 seconde donc j'ai enlevé mon if dans if(sleep()!=0) et maintenant j'ai le bon temps d'attente
    Merci encore

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

Discussions similaires

  1. Les variables dans les conteneur
    Par moham104 dans le forum Général Java
    Réponses: 2
    Dernier message: 05/12/2013, 08h55
  2. Question sur la recherche dans les chaînes de caractères
    Par Garamante dans le forum VBScript
    Réponses: 5
    Dernier message: 15/12/2008, 17h33
  3. Réponses: 21
    Dernier message: 18/11/2008, 14h36
  4. Questions sur la navigation dans les répertoires
    Par belle5656 dans le forum Langage
    Réponses: 86
    Dernier message: 03/11/2007, 20h44

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