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

Shell et commandes GNU Discussion :

Shell Exercice lockfile Sync


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2011
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 56
    Par défaut Shell Exercice lockfile Sync
    Bonjour à tous,

    je dois réaliser un exercice pour un cours (Multiprog systèmes dans le cadre d'un diplôme de math). Je bloque sur une question. Mon niveau en Shell est Débutant.

    J'ai deux morceaux de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #! /bin/bash
    # lancement.sh
    i=0
    rm -f fichier
    rm -f copie
    while [ $i -lt $1 ] ; do
    ./ecrivain.sh $i fichier &
    ./ecrivain.sh $i copie $! &
    i=‘expr $i + 1done

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #! /bin/bash
    # ecrivain.sh
    inst1
    if [ $# -eq 3 ] ; then
    echo $3 : $1 >> $2
    else
    echo $$ : $1 >> $2
    fi
    Comme on le voit dans lancement.sh, les appels à ecrivain.sh se font en parallèle et n'assurent donc pas que les fichiers fichier et copie soient identiques.

    On me demande de modifier uniquement le script ecrivain.sh, pour garantir que fichier et copie soient identiques.
    Aide : identifiez la section critique (quand commence-t-elle ? quand finit-elle ?).

    De ce que je comprends, j'ai deux outils principaux pour réaliser ceci :
    - lockfile => les verrous
    - sync => la synchronisation
    Même si je maîtrise les deux outils, je ne parviens pas à obtenir le résultat escompté

    Merci pour votre aide.
    N.

  2. #2
    Membre averti
    Inscrit en
    Septembre 2011
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 56
    Par défaut
    J'ai trouvé.
    voici la solution que j'ai adoptée. C'est un peu "non esthétique" mais cela fonctionne.
    Merci
    N.

    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
    #! /bin/bash
    # ecrivain.sh
    if [ $# -ne 3 ] ; then
    	while [ ! -f $$.sync ]
    	do
    		sleep 1
    	done
    	rm -f $$.sync
    fi
     
    if [ $# -eq 3 ] ; then
        lockfile -1 resA.verrou
        echo $3 : $1 >> $2
        echo > $3.sync
    else  
        echo $$ : $1 >> $2
        rm -f resA.verrou
    fi

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 662
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 662
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if [ $# -eq 3 ]
    [...]
    else # donc `$# -ne 3'; alors à quoi sert `if [ $# -ne 3 ]' ?
    [...]
    fi
    également :
    tant qu'une chose n'est pas vraie = jusqu'à ce qu'une chose soit vraie
    => et je ne vois pas à quoi sert lockfile puisque c'est la boucle qui fait patienter le script.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre averti
    Inscrit en
    Septembre 2011
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 56
    Par défaut
    N_BaH : Merci pour la réponse

    Le bloc if me permet de bloquer (jusqu'à synchronisation) uniquement le fichier "fichier" car il vient avec seulement 2 arguments en entrée de fonction. Le fichier "copie" vient avec 3 arguments. Le else est finalement implicite. Si c'est le fichier "fichier" on bloque, si c'est le fichier "copie", on continue l'exécution. L'utilisation du if n'est peut être pas la meilleure j'en conviens.

    La simple utilisation de la synchronisation ne permet pas de garantir que les fichiers seront identiques. Tout ce qu'on garanti c'est que l’écriture dans le fichier "fichier" pour chaque itération se fera après l'écriture dans le fichier "copie".
    On pourrait donc avoir séquentiellement les écritures suivantes :

    Copie : 0
    Copie : 1
    Copie : 2
    Fichier : 2
    Fichier : 1
    Fichier : 0
    Copie: 3
    Fichier : 3

    Les deux fichiers ne sont pas identiques.

    L'utilisation conjointe du lockfile avec la synchronisation, comme elle est faite dans le code, garanti que les deux fichiers seront identiques.

    Merci
    N.

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 662
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 662
    Par défaut
    si tu testes le même élément (ici $#), tu n'as pas besoin de plusieurs if.

    quant à lockfile, je n'avais fait qu'un essai, qui ne bloquait pas, mais, effectivement, lorsque le fichier existe lockfile ne peut le créer, donc il bloque !
    tu pourrais t'en dispenser avec le même genre de boucle que si test $# -ne 3, mais inversée : tant que le fichier existe; attendre 1sec.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. Exercice en shell
    Par sunriseprogramer dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 13/11/2008, 14h57
  2. Exercice a resoudre en shell + C
    Par sunriseprogramer dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 13/11/2008, 09h56
  3. Shell exercice débutant
    Par Larffas dans le forum Windows
    Réponses: 1
    Dernier message: 17/01/2007, 10h05
  4. Exercice linux shell
    Par satinrouge dans le forum Linux
    Réponses: 1
    Dernier message: 05/06/2006, 14h13

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