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

Linux Discussion :

Utilisation de semaphores


Sujet :

Linux

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 46
    Points : 21
    Points
    21
    Par défaut Utilisation de semaphores
    Je suis très peu expérimenté dans la programmation c, et pour la fac les profs nous demande d'implémenter le problème des fumeurs (synchronisation de processus via des sémaphores).
    Je pense que le problème vient d'une mauvaise connaissance du langage, mais malgré plusieurs essais, je ne trouve pas mon erreur, si vous pouviez m'aider.

    Voici donc le debut 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
     
    #include <stdio.h>
    #include <sys/types.h>
    #include <time.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <semaphore.h>       
    #include <assert.h>
    #include <errno.h>
    #include <signal.h>
     
     
    sem_t elements [3];	// les elements necessaires au fumeur sont stockés sous forme de tableau de semaphores, remplacer le type int par un type de semaphores, pui effectuer des modifs dans up et dans down
     
    void init_sem(){	//initialise notre tableau de semaphore (toutes les semaphores a 1)
    	sem_init (&elements[0],1,0); 
    	sem_init (&elements[1],1,0);
    	sem_init (&elements[2],1,0);
    };
     
     
    void down(int a){
    	sem_wait(&elements[a]);
    };
     
    void up(int a){
    	sem_post(&elements[a]);
    };
    Et voici l'erreur qui m'est renvoyée quand je compile
    (commande tapée "gcc fum2.c") et j'ai testé aussi "g++ fum2.cpp" (en renommant le .c en .cpp, la meme erreur est sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    /tmp/ccpdibJc.o: In function `init_sem':
    fum2.c:(.text+0x1e): undefined reference to `sem_init'
    fum2.c:(.text+0x3a): undefined reference to `sem_init'
    fum2.c:(.text+0x56): undefined reference to `sem_init'
    /tmp/ccpdibJc.o: In function `down':
    fum2.c:(.text+0x76): undefined reference to `sem_wait'
    /tmp/ccpdibJc.o: In function `up':
    fum2.c:(.text+0x91): undefined reference to `sem_post'
    collect2: ld returned 1 exit status

  2. #2
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 265
    Points : 2 446
    Points
    2 446
    Par défaut
    À première vue, je dirais : La variable sem_init est-elle déclarée ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 46
    Points : 21
    Points
    21
    Par défaut
    Voila ce que dit la documentation concernant la librairie semaphore.h

    http://brickos.sourceforge.net/docs/...aphore_8h.html

    j'en ai déduis qu'il suffisait d'appeler la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int 	sem_init (sem_t *sem, int pshared, unsigned int value)
     	Initialize a semaphore.
     
    int 	sem_wait (sem_t *sem)
     	Wait for semaphore (blocking). 
     
    int 	sem_post (sem_t *sem)
     	Post a semaphore.
    PS: tout le debut du code est copié-collé, donc non je n'ai pas declaré de variable sem_....

  4. #4
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 265
    Points : 2 446
    Points
    2 446
    Par défaut
    Alors essaye sans l'espace entre le nom de la fonction & la parenthèse ouvrante.
    Boarf, ce n'est pas que j'y croie beaucoup, mais bon.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 46
    Points : 21
    Points
    21
    Par défaut
    Merci quand meme, j'ai testé, sa ne change rien, toujours les memes erreurs.

  6. #6
    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 : 46
    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
    Il faut que tu te link avec la libpthread. Ajoutes -lpthread dans ta ligne de commande gcc :

  7. #7
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    Bonjour,

    Citation Envoyé par matafan Voir le message
    Il faut que tu te link avec la libpthread. Ajoutes -lpthread dans ta ligne de commande gcc :
    Il y vraiment des systèmes où les fonctions realtime sont dans la bibliothèque des pthreads ? Je pencherais plutôt pour -lrt, sinon vérifier dans la man page d'une des fonctions.

  8. #8
    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 : 46
    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
    Oui effectivement -lrt c'est mieux, même si -lpthread résoud indirectement le problème. man sem_overview dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       Linking
           Programs  using  the POSIX semaphores API must be compiled with cc -lrt
           to link against the real-time library, librt.

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par isildur37 Voir le message
    Et voici l'erreur qui m'est renvoyée quand je compile
    (commande tapée "gcc fum2.c") et j'ai testé aussi "g++ fum2.cpp" (en renommant le .c en .cpp, la meme erreur est sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    /tmp/ccpdibJc.o: In function `init_sem':
    fum2.c:(.text+0x1e): undefined reference to `sem_init'
    fum2.c:(.text+0x3a): undefined reference to `sem_init'
    fum2.c:(.text+0x56): undefined reference to `sem_init'
    /tmp/ccpdibJc.o: In function `down':
    fum2.c:(.text+0x76): undefined reference to `sem_wait'
    /tmp/ccpdibJc.o: In function `up':
    fum2.c:(.text+0x91): undefined reference to `sem_post'
    collect2: ld returned 1 exit status
    Parce que ta commande de compilation "gcc" demande la création de l'exécutable complet et qu'il manque plein de trucs pour faire de ce bout de code un exécutable.
    Te manque la fonction main() et les librairies qui contiennent le code des fonctions sem_init et sem_wait.

    Si tu veux juste vérifier la syntaxe de ton code, ou le compiler comme module qui sera inclus plus tard, faut que tu fasses "gcc -c fum2.c". Si ça marche, ça te génèrera un "fum2.o" que tu pourras inclure plus tard avec un autre source par une commande de compilation adéquate.

    Ici les cours et tutoriels pour apprendre C : http://c.developpez.com/cours/

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 46
    Points : 21
    Points
    21
    Par défaut
    Je vous remercie tous de vos réponses. Finalement la prof s'est aperçue que personne ne connaissait suffisamment le c pour faire ce code... Et ce que vous me dite la au niveau de la compilation, j'en avais jamais entendu parler, mais jpense que sa va me servir, je prend note, et encore merci.

    @Sver, j'ai tout le code, mais j'ai juste mis les declarations puisque je pense que les erreur venaient de la. Il y a bien un main() dans le programme complet

Discussions similaires

  1. Utilisation semaphore en variable globale
    Par number8one dans le forum LabVIEW
    Réponses: 1
    Dernier message: 13/12/2010, 10h50
  2. Utilisation des semaphores unix
    Par bramsereo dans le forum Unix
    Réponses: 2
    Dernier message: 28/12/2008, 22h57
  3. Utilisation Semaphore & Shared memory
    Par Sphost dans le forum POSIX
    Réponses: 2
    Dernier message: 17/12/2008, 13h12
  4. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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