Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#26 Le 05/05/2010, à 20:49

Totor

Re : read < FIFO Appel système interrompu

Bon...j'ai trouvé !!! cool

J'ai réussi à reproduire le comportement que tu avais sans envoyer le "stop" immédiatement après le "go" (j'utilisais printf "go\nstop\n" > /tmp/fifo) et avec la version de script suivante :

while [ "${ligne}" != "stop" ]
do
	 read -u 4 ligne
	 echo "."
	[ "$ligne" = "go" ] && Num &
done

J'avais alors une boucle infinie et le message d'erreur que tu as.
Par contre, si j'enlève le echo, je n'ai pas de boucle infinie hmm 

Je suis donc revenu en arrière pour essayer de comprendre pourquoi les autres versions fonctionnaient.
Ma base de travail fut celle-ci :

while read -u 4 ligne
do
	[ "$ligne" = "stop" ] && break;
	[ "$ligne" = "go" ] && 	Num &
	echo ".."
done

Voici les traces que j'obtenais :

+ read -u 4 ligne
+ '[' go = stop ']'
+ '[' go = go ']'
+ echo ..
..
+ read -u 4 ligne
+ Num
+ exec
+ for n in '{0..10}'
+ echo 0
0
+ sleep 0.1
+ for n in '{0..10}'
+ echo 1
1
+ sleep 0.1
+ for n in '{0..10}'
+ echo 2
2
+ sleep 0.1
+ for n in '{0..10}'
+ echo 3
3
+ sleep 0.1
+ for n in '{0..10}'
+ echo 4
4
+ sleep 0.1
+ for n in '{0..10}'
+ echo 5
5
+ sleep 0.1
+ for n in '{0..10}'
+ echo 6
6
+ sleep 0.1
+ for n in '{0..10}'
+ echo 7
7
+ sleep 0.1
+ for n in '{0..10}'
+ echo 8
8
+ sleep 0.1
+ for n in '{0..10}'
+ echo 9
9
+ sleep 0.1
+ for n in '{0..10}'
+ echo 10
10
+ sleep 0.1

Le script s'arrète et c'est ce qui m'interpelle.
Pourquoi s'arrète t'il alors qu'il n'a pas reçu le "stop".

Après divers tests, je trouve l'explication : au 2nd passage de boucle, read trouve le fichier /tmp/fifo fermé en écriture et ayant atteind la fin du fichier au premier passage, il ne bloque pas et retourne un status <> 0.
Le bloc while ne s'exécute donc pas.

Voici donc la solution :

exec 4<>/tmp/fifo
while read -u 4 ligne
do
	[ "${ligne}" = "stop" ] && break;
	[ "$ligne" = "go" ] && 	Num &
done
exec 4>&- 4<&-

Ainsi, le fichier reste ouvert en écriture et read bloque jusqu'à ce qu'on lui ait envoyé "stop".

Retour sur le script qui boucle de façon infinie : pourquoi boucle t'il avec le echo mais pas sans le echo ???!!??? yikes
Hypothèse : Sans echo, mon cpu (AMD Phenom(tm) 9950 Quad-Core Processor) a le temps d'effectuer toutes les instructions du bloc while ainsi que la condition puis de revenir au read avant que le fichier ne soit fermé ?!?!? (mais je suppute)

Dernière modification par Totor (Le 06/05/2010, à 06:44)


-- Lucid Lynx --

Hors ligne

#28 Le 05/05/2010, à 22:30

AnsuzPeorth

Re : read < FIFO Appel système interrompu

Totor a écrit :

Par contre, si j'enlève le echo, je n'ai pas de boucle infinie

J'avais essayé de l'enlever, sous python j'ai eu le problème inverse, si pas de print, boucle infini, alors que le print la bloquée (sortie readline d'un Popen).

Totor a écrit :

Hypothèse : Sans echo, mon cpu (AMD Phenom(tm) 9950 Quad-Core Processor) a le temps d'effectuer toutes les instructions du bloc while ainsi que la condition puis de revenir au read avant que le fichier ne soit fermé ?!?!? (mais je suppute)

Ca doit être un truc du genre, y a pas de raisons !


J'ai essayé ton dernier exemple et ça fonctionne nickel.

Mais maintenant je sais plus quelle méthode employer, ton principe ou les boucles imbriquées ???

Les boucles imbriquées lancent à chaque tour un read, alors que ta méthode ne lance qu'un read et se met en attente.
Les boucles lancent 2 sous-processus, contre 1 pour ta technique ...
Donc, ta méthode devrait être la meilleure ? Mais peut être que les boucles imbriquées, comme le principe est plus simple, peut être plus fiable ???

La boucle est qd même le coeur du script que je fais, alors faut que je fasse le bon choix ...
Niveau fiabilité, quelle méthode choisir ???
J'ai essayé dans mes exemples, ta méthode fonctionne parfaitement également (peut être un chouillas mon gourmand pour une progressbar 0.01s d'itération, mais le résultat est identique, un petit + pour ta méthode qd même).

Avis bienvenue smile

edit: Ahhh, j'ai eu un petit bug, une seule fois avec ta méthode.... Une seule fois ! Mais c'est un bug venant du python-gtk, il faudrait que j'augmente le tempo pour l'éviter.... Arfff, choix difficile smile

Dernière modification par AnsuzPeorth (Le 05/05/2010, à 22:52)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne