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

Réseau C Discussion :

Verrouillage d'un fifo accessible par plusieurs prog


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Par défaut Verrouillage d'un fifo accessible par plusieurs prog
    Bonjour,
    je dois créer une mini application "client-serveur" avec des fifos (pas des sockets, des fifos). Pour l'instant, ça fonctionne en mono utilisateur et je dois le passer en multi-utilisateurs.

    Problème: le fifo du serveur (auquel j'envoie les requêtes) devient une ressource critique. Je pensais à le verrouiller du coté client:
    -verrouillage écriture (pour les autres clients)
    -écriture de la requete
    -déverrouillage

    Cela à l'aide de la fonction fcntl(). Je me demandais si mon raisonnement était possible. Il me semble que non, si je verrouille en écriture, je ne saurais plus écrire dans le fifo avant le déverouillage. Comment pourrais-je faire?

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Je t'aurais bien dit une sémaphore mais je ne pense pas qu'on puisse les utiliser en dehors de l'utilisation des Threads, il faut sinon créer un système similaire mais sans Thread alors Bien sûr, ce n'est qu'une idée en passant donc bloquer à la lecture pendant l'écriture et vice versa.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre éclairé
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Par défaut
    Dans le programme client, je n'utilise pas de threads. Inutile puisqu'on lance plusieurs fois le même prog. C'est dans le serveur que j'utilise les threads, mais je n'ai pas besoin de verrouillage là-bas. En regardant sur internet, j'ai essayé ceci (dans le client):
    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
        // Ouvreture du fifo requête
        fdW = open("/tmp/requete", O_WRONLY);
        if (fdW == -1) {
          perror("Erreur d'ouverture du fichier serveur");
          return -1;
        }
     
        //Verrouillage
        verrou.l_type = F_RDLCK; //bloque l'écriture aux autres processus (donc autres clients)
        verrou.l_whence = 0;
        verrou.l_start = 0;
        verrou.l_len = 0;
     
        if (fcntl(fdW, F_SETLKW, &verrou)== -1){
          perror("Erreur de verrouillage");
        }
     
        //Envoi de la requête
        nbWrite = write(fdW, &requete, sizeof(requete));
        if (nbWrite < sizeof(requete)) {
          perror("Erreur d'écriture");
        }
     
        //Déverrouillage
        verrou.l_type = F_UNLCK; 
        if (fcntl(fdW, F_SETLKW, &verrou)== -1){
          perror("Erreur de deverrouillage");
        }
     
        close(fdW);
    Mais là, il me dit: Erreur de verrouillage: Bad file descriptor

    Pourtant après l'affichage de l'erreur, il m'affiche bien la réponse, donc la requête a bien été envoyé et traitée par le serveur ==> le descripteur est bon.

    Je n'ai jamais fait de verrouillage avant, mais j'ai l'impression que ça vient du fait que ce soit pas un fichier, mais un fifo (pipe). Je me trompe?

  4. #4
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Juste comme ça histoire de dire ... les fifos (pipe) ça ne s'ouvre pas avec "popen()" au lieu de "open()" ?

  5. #5
    Membre éclairé
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Par défaut
    popen retourne un FILE * et pour mes opérations de lecture/écriture, j'ai besoin d'un descripteur (int).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FILE *popen(const char *command, const char *type);
     
    int open(const char *pathname, int flags);
    int open(const char *pathname, int flags, mode_t mode);

  6. #6
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Pourquoi ne pas utiliser "fileno()" dans ce cas pour récupérer un handle int à partir du FILE* ?

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

Discussions similaires

  1. Application accessible par plusieurs utilisateurs en même temps..
    Par flamby6969 dans le forum Modélisation
    Réponses: 3
    Dernier message: 30/03/2009, 00h42
  2. Ouvrire access par plusieur utilisateurs
    Par sid_ali_2007 dans le forum IHM
    Réponses: 1
    Dernier message: 08/03/2008, 19h41
  3. Réponses: 6
    Dernier message: 16/07/2007, 16h44
  4. Réponses: 22
    Dernier message: 23/11/2006, 23h42
  5. Variable accessible par plusieurs clients
    Par mezoo dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 06/10/2006, 10h08

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