4 votes

Comment puis-je signaler à un enfant bifurqué de se terminer en Perl ?

Comment faire pour que la même variable soit partagée entre les processus bifurqués ? Ou dois-je écrire dans un fichier dans le parent puis lire la valeur enregistrée dans le fichier dans l'enfant une fois que le fichier existe ? $quelque chose ne semble jamais être mis en place dans ce cas, donc cela tourne en boucle dans le sleep.

my $something = -1;
&doit();
sub doit
{

 my $pid = fork();
 if ($pid == 0)
 {
      while ($something == -1)
      {
         print "sleep 1\n";
         sleep 1;
      }
      &function2();
 }
 else
 {
     print "parent start\n";
    sleep 2;
    $something = 1;
    print "parent end: $something\n";
 }
}

sub function2 {
   print "END\n";
}

9voto

Sinan Ünür Points 76179

perldoc -f fork :

Les descripteurs de fichiers (et parfois les verrous sur ces descripteurs) sont partagés, tandis que tout le reste est copié.

Voir aussi Communication bidirectionnelle avec soi-même en perldoc perlipc .

Mise à jour : En y réfléchissant bien, vous voulez quelque chose comme ça ?

#!/usr/bin/perl

use strict;
use warnings;

my $pid = fork;

die "Cannot fork: $!" unless defined $pid;

if ($pid == 0) {
    print "Child start\n";
    my $end;
    local $SIG{HUP} = sub { $end = 1 };

    until ($end) {
        print "Sleep 1\n";
        sleep 1;
    }
    function2();
}
else {
    print "Parent start\n";
    sleep 5;
    kill HUP => $pid;
    waitpid($pid, 0);
}

sub function2 {
    print "END\n";
}

Sortie :

C:\Temp> w
Parent start
Child start
Sleep 1
Sleep 1
Sleep 1
Sleep 1
Sleep 1
END

6voto

Arkaitz Jimenez Points 10651

Les variables ne sont normalement pas partagées entre les processus, si vous voulez communiquer entre deux processus, il vaut mieux utiliser des pipes ou de la mémoire partagée ou tout autre IPC.

1voto

hillu Points 4033

Si vous voulez vraiment partager un état entre plusieurs processus à l'aide d'une interface qui ressemble superficiellement à un accès en lecture/écriture aux variables, vous pouvez jeter un coup d'oeil à IPC::Shareable .

0voto

Chris Jester-Young Points 102876

Je pense que vous voulez utiliser des threads ; les processus ne sont pas des threads (bien qu'à un moment donné, les threads Linux étaient implémentés en utilisant un type spécial de processus qui partageait la mémoire avec son parent).

0voto

Schwern Points 33677

Vous avez plusieurs possibilités. Les fils , prises de courant , IPC et l'écriture dans un fichier avec le verrouillage des fichiers. Personnellement, je recommanderais les threads, ils sont très faciles et sûrs en Perl, la plupart des installations les ont compilés et ils sont assez performants une fois qu'un thread a été créé.

Une alternative intéressante est le fourches qui émule les threads en utilisant une combinaison de fork() et de sockets. Je ne l'ai jamais utilisé moi-même, mais Elizabeth Mattijsen connaît ses threads.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X