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 :

Un problème avec sem_init


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9
    Par défaut Un problème avec sem_init
    Bonjour,
    Dans le cadre d'un petit projet multi thread, je désire utiliser des sémaphores.
    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
     
    #include <iostream>
    #include <semaphore.h>
    #include <errno.h>
     
    #include "A.h"
    #include "C.h"
     
    using namespace std;
     
    sem_t A_fin, C_fin, A_debut, C_debut;
     
    void print_sem(void)
    {
    	int val1, val2, val3, val4;
    	sem_getvalue(&A_fin, &val1);
    	sem_getvalue(&C_fin, &val2);
    	sem_getvalue(&A_debut, &val3);
    	sem_getvalue(&C_debut, &val4);
    	cout << " "<< val1 << " "<< val2 << " " << val3 << " "<< val4 << endl;
    }
     
    int main (int argc, char * const argv[])
    {
    	if(sem_init(&A_debut, 0, 0)==-1)cout << "Err on Ad : " << errno << endl;
    	if(sem_init(&C_debut, 0, 0)==-1)cout << "Err on Cd : " << errno  << endl;
    	if(sem_init(&C_fin, 0, 0)==-1)cout << "Err on Cf : " << errno << endl;
    	if(sem_init(&A_fin, 0, 0)==-1)cout << "Err on Af : " << errno  << endl;
         print_sem();
    	cout << "Sémaphore initialisés" << endl;
    /*...*/
    Voici la sortie :
    [Session started at 2006-09-07 07:18:55 +0200.]
    Err on Ad : 78
    Err on Cd : 78
    Err on Cf : 78
    Err on Af : 78
    125000 1 0 0
    Sémaphore initialisés

    Donc, chaque sémaphore s'initialise mal, puisque sem_init renvoie -1 et errno vaut 78. Ce code erreur est :"ENOSYS -> Function not implemented".
    Normallement cette erreur se produit si on demande à ce que le sémaphore soit partagé entre plusieur processus.
    Or avec mon 0 en deuxième argument de sem_init, cette erreur n'a pas lieu d'être me semble t il ???

    Encore plus troublant, l'appel de sem_print me montre que mon premier et deuxième sémaphore sont initialisés à 125000 (valeurs qui change selon les exécutions) et 1.

    Ce programme a été compilé avec g++ 4.0 (sous XCode), j'ai rajouté le flag -lpthread à la fin de ma ligne d'édition des liens.

    Quelqu'un peut il m'expliquer pourquoi mon init est faux ?
    Merci d'avance.

  2. #2
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Bonjour et bienvenu,

    Ton programme semble écrit en C++:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << "Sémaphore initialisés" << endl;
    Ici c'est le forum C. Il serait préférable que tu reposes ta question dans le bon forum .

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9
    Par défaut
    C'est pas tout à fait la réponse que j'attendais...
    Voici mon nouveau 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 <semaphore.h>
    #include <errno.h>
     
    #include "A.h"
    #include "C.h"
     
    sem_t A_fin, C_fin, A_debut, C_debut;
     
    void print_sem(void)
    {
    	int val1, val2, val3, val4;
    	sem_getvalue(&A_fin, &val1);
    	sem_getvalue(&C_fin, &val2);
    	sem_getvalue(&A_debut, &val3);
    	sem_getvalue(&C_debut, &val4);
    	printf ("%d %d %d %d\n", val1, val2, val3, val4);
    }
     
    int main (int argc, char * const argv[])
    {
    	if(sem_init(&A_debut, 0, 0)==-1)printf("Err On Ad %d\n", errno);
    	if(sem_init(&C_debut, 0, 0)==-1)printf("Err On Cd %d\n", errno);
    	if(sem_init(&C_fin, 0, 0)==-1)printf("Err On Cf %d\n", errno);
    	if(sem_init(&A_fin, 0, 0)==-1)printf("Err On Af %d\n", errno);
    	print_sem();
    	printf("Sémaphore initialisés\n");
    J'ai posté le message ici, car POSIX est une librairie C, et je ne pense pas que ce soit un problème d'écriture sur un flux, mais bien un problème avec l'utilisation de POSIX.
    D'ailleur, en modifiant le code pour qu'il soit purement en C, l'erreur est strictement la même, voici la trace de sortie du programme ci dessus :

    [Session started at 2006-09-07 07:39:00 +0200.]
    Err On Ad 78
    Err On Cd 78
    Err On Cf 78
    Err On Af 78
    -1073743076 1 0 -1879043472

    Un autre suggestion plus constructive ?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9
    Par défaut
    A priori la fonction sem_init n'a pas été porté sous Darwin...
    Je suis donc entrain d'essayer avec sem_open, je mettrai à jour le post si ça marche avec sem_open...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9
    Par défaut
    Ca y'est c'est résolue.
    Décidément, c'est un monologue ce post... Il ne vous a pas attiré ?
    En fait c'est bien que la lib pthread qui a été porté sous Darwin (Mac OS) n'a pas la fonction sem_init.
    On est obligé de passer par la fonction sem_open....

    Voici un code qui marche :

    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
     
    #define __DARWIN__
    #define _POSIX_SEMAPHORES
    #define PERMISSION	S_IRUSR | S_IWUSR
     
    #include <iostream>
    #include <semaphore.h>
    #include <errno.h>
     
    #include "A.h"
    #include "C.h"
     
    using namespace std;
     
    static sem_t *A_fin;
    static sem_t *C_fin;
    static sem_t *A_debut;
    static sem_t *C_debut;
     
    void print_sem(void)
    {
    	int val1, val2, val3, val4;
    	val1 = val2 = val3 = val4 = 1;
    	sem_getvalue(A_fin, &val1);
    	sem_getvalue(C_fin, &val2);
    	sem_getvalue(A_debut, &val3);
    	sem_getvalue(C_debut, &val4);
    	printf ("%d %d %d %d\n", val1, val2, val3, val4);
    }
     
    int main (int argc, char * const argv[])
    {
    	printf("VM :%d\n", SEM_VALUE_MAX);
    #ifdef __LINUX__
    	if(sem_init(A_debut, 0, 0)==-1)cout << "Err On Ad %d\n" << errno << endl;
    	if(sem_init(C_debut, 0, 0)==-1)cout << "Err On Cd %d\n" << errno << endl;
    	if(sem_init(C_fin, 0, 0)==-1)cout << "Err On Cf %d\n" << errno << endl;
    	if(sem_init(A_fin, 0, 0)==-1)cout << "Err On Af %d\n" << errno << endl;
    #endif
    #ifdef __DARWIN__
    	A_debut = sem_open("../../A_debut", O_CREAT, PERMISSION, 0);
    	C_debut = sem_open("../../C_debut", O_CREAT, PERMISSION, 0);
    	A_fin = sem_open("../../A_fin", O_CREAT, PERMISSION, 0);
    	C_fin = sem_open("../../A_fin", O_CREAT, PERMISSION, 0);
     
    	if((int)A_debut == SEM_FAILED) cout << "Erreur A_debut : " << errno << endl;
    	if((int)C_debut == SEM_FAILED) cout << "Erreur C_debut : " << errno << endl;
     	if((int)A_fin == SEM_FAILED) cout << "Erreur A_fin : " << errno << endl;
    	if((int)C_fin == SEM_FAILED) cout << "Erreur C_fin : " << errno << endl;
    #endif	
    	cout << "Sémaphore initialisés" << endl;
    Excusez les cout... c'est la même en C avec des printf.

    Il faut s'assurer d'un truc quand on utilise un sem_open... le premier argument est un fichier. Donc il faut avoir l'autorisation d'écriture à l'endroit que l'on indique.

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

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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