2009-08-11 5 views
4

Comment est-ce que je peux partager la même variable entre le processus fourchu? 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 se mettre dans cette sorte il boucle juste dans le sommeilComment puis-je signaler à un enfant forké de se terminer en Perl?

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"; 
} 

Répondre

9

perldoc -f fork:

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

Voir également Bidirectional Communication with Yourself dans perldoc perlipc.

Mise à jour: À la réflexion, voulez-vous 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 
6

Les variables ne sont pas normalement partagées entre les processus, si vous voulez communiquer 2 processus vous feriez mieux de tuyaux d'utilisation ou de la mémoire partagée ou tout autre IPC .

+2

Ne pas lier à des copies piratées de livres. –

+1

N'a pas remarqué, désolé pour cela –

0

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

+2

Notez que par défaut toutes les variables dans les threads perl sont thread-local - voir perldoc threads :: shared pour plus d'informations – bdonlan

+1

Je doute beaucoup que. Les cas d'utilisation des threads Perl sont rares. – ysth

+1

@ysth Et partager des données entre des tâches parallèles en fait partie. – Schwern

1

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

0

Vous avez plusieurs options. Threads, sockets, IPC et d'écrire dans un fichier avec le verrouillage de fichier. Personnellement, je recommande les threads, ils sont très faciles et sûrs en Perl, la plupart des installations les compilent et ils sont assez performants une fois qu'un thread a été créé.

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

Questions connexes