2011-05-17 2 views
0

J'ai trouvé a comment qui fait allusion à un problème que je vois, dans lequel un enfant fork ed de IPC::Open3 exécute le code de programme principal au lieu de seulement exec comme je m'attendais.open3 fuites de processus?

Est-ce que quelqu'un d'autre a l'expérience des processus «fuite» sur IPC :: Open3? J'ai regardé par-dessus la source de la bibliothèque et je n'ai rien vu de choquant.

est avec Perl 5.8.4 (oui, je sais ... mais il ne peut pas être mis à jour) en cours d'exécution sur Solaris 10.

+0

Peut-être utiliser IPC :: Run à la place? Il est suggéré à la page Perl 5.14.0 pour [IPC :: Open3] (http://search.cpan.org/~jesse/perl-5.14.0/ext/IPC-Open3/lib/IPC/Open3.pm). Certes, vous êtes bloqué sur 5.8.4, mais peut-être que IPC :: Run fonctionne bien ici. –

Répondre

2

Bien que cela a été corrigé depuis, le open3 de 5.8.4 pourrait lancer une exception à partir de l'enfant, ce qui signifie que le parent et l'enfant peuvent "renvoyer" de open3.

Alors que vous pouvez gérer cela, c'est un peu compliqué. * Il serait plus facile de remplacer votre IPC/Open3.pm par le one d'un Perl plus récent. Mieux encore, si vous n'avez pas besoin de quelque chose d'aussi bas que IPC :: Open3, vous pouvez utiliser un module de plus haut niveau tel que IPC::Run3 (plus simple) ou IPC::Run (plus puissant).

* — Au minimum,

my $parent_pid = $$; 
my $pid = eval { open3(...) }; 
if (!$pid) { 
    if ($parent_pid == $$) { 
     # Exception in parent. 
     die([email protected]); 
    } else { 
     # Exception in child (pre-exec). 
     print STDERR [email protected]; 
     _exit(255); 
    } 
} 
Questions connexes