Pascal BEAUSSART

|&


L'instruction |& crée une entrée/sortie entre un programme background (co-processus) et son parent.

Exemple 1 : calcul

/usr/bin/bc |&              # co-process evaluation d'expressions
print -p "scale = 2"        # 2 chiffres derrière la virgule
while read op'?opération> '                    
do if [[ "$op" = "quit" ]]  # faire quit pour sortir
   then exit                # arrêt du père et du fils
   fi                       
   print -p $op             # entrer l'opération
   read -p rep              # lire la réponse
   print "\t= $rep"         
done 
opération> (4+6)/6
         = 1,66
opération> 4+6/6
         = 5,00
opération> quit

Exemple 2 : Le jeu du nombre magique
Le but du jeu est de trouver le nombre magique, compris entre 0 et 100.
(typeset -i h=100 b=0 c=0
x=$(( 100*$RANDOM/32767 ))
while :
do read -r c
   if (( c >= b && c <= h ))
   then if (( c < x ))
        then b=$c
        elif (( c > x ))
          then h=$c
          else b=$c;h=$c
        fi
   fi
   print $b $h
done)|&

typeset -i B H c
while read c'?essai> '
do print -p $c
   read -p B H
   if (( B == H ))
   then print "trouve !"
        exit
   else print "compris entre $B et $H"
   fi
done

Exemple 3 : Travailler en parallèle sur 2 machines
Cet exemple montre comment faire des dumps de librairies sur une machine tout en les rechargeant le dump précédent sur un autre.
Le code retour du rechargement étant surveillé.
Nota : Dans l'exemple ci-après, les fonctions dump, traitement_erreur, transferer et les variables machine2, recharger, utilisateur, liste_des_librairies sont à définir.
typeset -i rc=0
#--- lancement du coprocessus d'action à distance
  ( while read -r args
    do [[ $args = "end" ]] && break
       rsh $machine2 -l $utilisateur "($args >/dev/null;print \$?)"
    done
  )|&
#--- création des dumps durant les rechargements sur machine2
oldLIB='null'
for LIB in $liste_des_librairies
    #--- lancement d'un dump 
    dump $LIB
    if [[ "$oldLIB" != "null" ]]
    then echo "$oldLIB - Attente de fin de rechargement sur $machine2"
         #--- lecture du code retour du rechargement dans le coprocessus
         read -p rc
         if (( $rc ))
         then traitement_erreur $oldLIB $rc
         else echo "$oldLIB - rechargement librairie OK"
         fi
    fi
    #--- transfert sur machine2
    transferer $LIBtar
    if (( $rc ))
    then echo "$LIB - Problème durant la recopie vers $machine2"
    else echo "$LIB - Lancement du rechargement sur $machine2"
         #--- Ecriture dans le coprocessus pour rechargement de la LIB sur machine2
         print -p "$recharger $LIB"
    fi
    oldLIB=$LIB
done
#--- Terminer le traitement du rechargement en cours avant de poursuivre
if [[ "$oldLIB" != "null" ]]
then echo "$oldLIB - Attente de fin de rechargement sur $machine"
     #--- lecture du code retour du rechargement dans le coprocessus
     read -p rc
     if (( rc ))
     then traitement_erreur $oldLIB $rc
     else echo "$oldLIB - rechargement librairie OK\n"
     fi
fi
#--- Arréter le co-processus
print -p "end"

[RETOUR] [HOME]