salut,
Voila la situation, je voudrai lance un processus fils qui execute une commande via system. Le processus pere doit lire les sortie STDERR et STDOUT. Pour cela je cree 2 pipes bien distinct et je redirige les sortie stderr et stdout du fils vers les descripteurs correspondant que le pere lit.
De facons synchrone pas de pb je lis STDOUT puis STDERR. Seulement je voudrai ne pas etre dependant de l attente sur les descripteurs et avoir donc une lecture asynchrone.
Pour cela j ai suivie 2 pistes :
- je file les descripteurs via des threads qui lisent le contenue chacun de leurs cotes. J ai essaye de creer d abord 1 fonction pour lire les flux avant de les lancer dans des threads :
PB : des la premiere iteration ils sortent de la boucle, de plus si je force la lecture a en faisant tourner la premiere boucle, je me retrouve toujours avec meme chaine de caractere.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 sub readOutput { my $end_f = 0; while( !$end_f ) { while( my $l = <$_[0]> ) { print $l; } if( eof(<$_[0]>) ) { print "END OF FILE\n"; $end_f = 1; } } }
- j ai essaye ensuite d utiliser le flag O_NONBLOCK sur les descripteurs afin de les rendres non bloquant sur lesquels je lis ce qui est renvoye par le fils et j attend le EOF sur les 2 descritpeurs.
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
37 my $flags = fcntl(R_OUT, F_GETFL, 0) or die "Can't get flags for the FILE: $!\n"; $flags = fcntl(R_OUT, F_SETFL, $flags | O_NONBLOCK) or die "Can't set flags for the FILE: $!\n"; $flags = fcntl(R_ERR, F_GETFL, 0) or die "Can't get flags for the FILE: $!\n"; $flags = fcntl(R_ERR, F_SETFL, $flags | O_NONBLOCK) or die "Can't set flags for the FILE: $!\n"; my $inputEnd =2; while( $inputEnd != 0) { print "boucle "; while( my $err_line = <R_ERR> ) { print "R_ERR ". $err_line; } while( my $out_line = <R_OUT> ) { print "R_OUT ". $out_line; } if( eof(R_ERR) ) { $inputEnd--; close(R_ERR); print "ERR END \n"; } if( eof(R_OUT) ) { $inputEnd--; close(R_OUT); print "OUT END \n"; } } }
PB : des la premiere iteration ils sortent aussi de la boucle.
Donc voila je pense que le probleme vient de la condition de sortie mes boucles, je viens de debuter en perl donc je dois louper quelques choses quelques part, si quelqu'un sait la condition qu'il faut tester afin de savoir quand je peux sortir de la boucle.
Merci.
Partager