2010-10-26 25 views
1

J'essaie de faire une tâche de base de multitraitement et c'est ce que j'ai. Tout d'abord, je ne connais pas la bonne façon de faire de ce programme un processus non bloquant, car lorsque j'attends la réponse d'un enfant (avec waitpid) les autres processus doivent aussi attendre dans la file d'attente, mais , que se passera-t-il si certains processus enfants meurent avant (je veux dire, les processus meurent dans le désordre)? Donc, j'ai cherché et je foudrais que je puisse obtenir le PID du processus qui vient de mourir, pour cela j'utilise waitpid(-1, WNOHANG). Je reçois toujours un avertissement que WNOHANG n'est pas un nombre, mais quand j'ai ajouté la lib sys_wait_h, je n'ai pas eu cette erreur mais le script n'attend jamais de PID, quelle peut être l'erreur?Problèmes lors de l'exécution d'une tâche multitraitement en Perl

 

#!/usr/bin/perl 
#use POSIX ":sys_wait_h"; #if I use this library, I dont get the error, but it wont wait for the return of the child 
use warnings; 

main(@ARGV); 

sub main{ 
my $num = 3; 
for(1..$num){ 
    my $pid = fork(); 
    if ($pid) { 
    print "Im going to wait (Im the parent); my child is: $pid\n"; 
    push(@childs, $pid); 
    } 
    elsif ($pid == 0) { 
    my $slp = 5 * $_; 
    print "$_ : Im going to execute my code (Im a child) and Im going to wait like $slp seconds\n"; 
    sleep $slp; 
    print "$_ : I finished my sleep\n"; 
    exit(0); 
    } 
    else { 
    die "couldn’t fork: $!\n"; 
    } 
} 

foreach (@childs) { 
    print "Im waiting for: $_\n"; 
    my $ret = waitpid(-1, WNOHANG); 
    #waitpid($_, 0); 
    print "Ive just finish waiting for: $_; the return: $ret \n"; 
} 
} 

Merci d'avance, salut!

Répondre

3

Si vous utilisez WNOHANG, le processus ne bloquera pas si aucun enfant n'est terminé. C'est le point de WNOHANG; cela garantit que waitpid() reviendra rapidement. Dans votre cas, il semblerait que vous vouliez simplement utiliser wait() au lieu de waitpid().

+0

Merci! Im en utilisant wait() et ça marche! Merci! – pablomarti

0

Je trouve que POE gère tout cela pour moi tout à fait bien. C'est un contrôle asynchrone (non bloquant) de toutes sortes de choses, y compris des processus externes. Vous n'avez pas à vous occuper de toutes les tâches de bas niveau parce que POE le fait pour vous.