Bonjour,
j'ai un problème pour fermer un pipe ouvert via open(FH, "|....."). Au cas où cela a une importance, je précise que je travaille sur MacOS Darwin Mavericks 10.9.5.
Voici le traitement que je fais :
1) j'ouvre un pipe via open(PIPE, "|......") qui lance un programme demandant en boucle des réponses et ne s'arrete pas tant qu'il n'a pas reçu une réponse d'arret bien précise (par exemple la lettre f)
2) je donne des réponses via print PIPE "....."
3) je ferme le pipe via close(PIPE)
=> au moment de la fermeture, j'obtiens un affichage en boucle infinie si la réponse d'arret n'a pas été donnée
Auriez-vous une idée pour gérer ce problème qui peut s'avérer problématique si l'affichage est redirigé vers un fichier dont la taille va gonfler gonfler jusqu'à remplir le disque ?
Voici un exemple pour illustrer le problème (voir également pièces jointes) :
+le programme suivant demande en boucle des réponses et effectue :
- une pause si la réponse est un réel
- une nouvelle demande si la réponse n'est pas un réel
- s'arrete seulement si la réponse est la lettre f
+le programme suivant appelle le précédent via un pipe et ne lui envoie pas la lettre f avant de fermer le pipe => affichage en boucle infinie
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 #!/usr/bin/perl use strict; #pattern d un reel pour les regex (desormais redondant avec $RE{num}{real} de Regexp::Common) my $format_reel = '[+-]?[\.]?\d+[\.]?\d*(?:[eE][+-]?\d*)?'; # # # boucle infinie tant que le choix "f" n a pas ete donne # # while() { #saisie d un temps de pause print "Temps de pause ? "; my $choix = <STDIN>; chomp($choix); #si le choix est la lettre f => arret if($choix eq 'f') { print "\n"; last; } #si le choix n est pas un reel, on redemande un nouveau choix elsif(not $choix =~ /^$format_reel$/) { print "choix \"$choix\" n est pas un reel...\n"; next; } #si le choix est un reel, on fait une pause de $choix secondes else { print "pause de $choix secondes\n"; select(undef, undef, undef, $choix); } } print "Fin..........\n";
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 #!/usr/bin/perl use strict; # # execution du script loop_pause.pl via un pipe # open(PIPE, "|loop_pause.pl"); print PIPE "1\n"; close(PIPE); print "apres la fermeture du pipe\n";
merci de votre aide.
Partager