Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Paul GABORIT
À (at) Sat, 05 Jun 2004 22:54:32 +0200, Benoit Izac écrivait (wrote):
Je veux exécuter une commande externe et récupérer la sortie standard et la sortie d'erreur dans mon script. Pour l'instant je fais :
use IPC::Open3; my $stdout; my $stderr;
my $pid = open3(undef, *FH1, *FH2, 'la commande externe'); { local $/; $stdout = <FH1>; $stderr = <FH2>; } # faire quelque chose avec $stdout; # faire quelque chose avec $stderr;
Je voudrais savoir si il y a une autre/meilleure solution.
C'est une solution... mais votre manière de lire stdout et stderr peut amener à un deadlock (on dit aussi interblocage ou étreinte de la mort). Dans votre cas, il suffit que la commande externe tente d'écrire un gros paquet de données sur stderr avant d'écrire quoi que ce soit sur stdout. C'est expliqué dans la doc de IPC::Open3. Deux solutions: vous utilisez 'select' ou IO::Select ou une approche similaire à celle de Parallel::Jobs ou, si c'est possible dans votre cas, vous utilisez le même filehandle pour stderr et stdout.
-- Paul Gaborit - <http://www.enstimac.fr/~gaborit/> Perl en français - <http://www.enstimac.fr/Perl/>
À (at) Sat, 05 Jun 2004 22:54:32 +0200,
Benoit Izac <use.reply.to@INVALID.ADDRESS> écrivait (wrote):
Je veux exécuter une commande externe et récupérer la sortie standard et
la sortie d'erreur dans mon script. Pour l'instant je fais :
use IPC::Open3;
my $stdout;
my $stderr;
my $pid = open3(undef, *FH1, *FH2, 'la commande externe');
{
local $/;
$stdout = <FH1>;
$stderr = <FH2>;
}
# faire quelque chose avec $stdout;
# faire quelque chose avec $stderr;
Je voudrais savoir si il y a une autre/meilleure solution.
C'est une solution... mais votre manière de lire stdout et stderr peut amener
à un deadlock (on dit aussi interblocage ou étreinte de la mort). Dans votre
cas, il suffit que la commande externe tente d'écrire un gros paquet de
données sur stderr avant d'écrire quoi que ce soit sur stdout. C'est expliqué
dans la doc de IPC::Open3. Deux solutions: vous utilisez 'select' ou
IO::Select ou une approche similaire à celle de Parallel::Jobs ou, si c'est
possible dans votre cas, vous utilisez le même filehandle pour stderr et
stdout.
--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>
À (at) Sat, 05 Jun 2004 22:54:32 +0200, Benoit Izac écrivait (wrote):
Je veux exécuter une commande externe et récupérer la sortie standard et la sortie d'erreur dans mon script. Pour l'instant je fais :
use IPC::Open3; my $stdout; my $stderr;
my $pid = open3(undef, *FH1, *FH2, 'la commande externe'); { local $/; $stdout = <FH1>; $stderr = <FH2>; } # faire quelque chose avec $stdout; # faire quelque chose avec $stderr;
Je voudrais savoir si il y a une autre/meilleure solution.
C'est une solution... mais votre manière de lire stdout et stderr peut amener à un deadlock (on dit aussi interblocage ou étreinte de la mort). Dans votre cas, il suffit que la commande externe tente d'écrire un gros paquet de données sur stderr avant d'écrire quoi que ce soit sur stdout. C'est expliqué dans la doc de IPC::Open3. Deux solutions: vous utilisez 'select' ou IO::Select ou une approche similaire à celle de Parallel::Jobs ou, si c'est possible dans votre cas, vous utilisez le même filehandle pour stderr et stdout.
-- Paul Gaborit - <http://www.enstimac.fr/~gaborit/> Perl en français - <http://www.enstimac.fr/Perl/>