2009-08-11 9 views
4

フォークされたプロセス間で同じ変数を共有するにはどうすればよいですか?または、親のファイルに書き込んだ後、そのファイルが存在すると、子のファイルに保存された値を読み込む必要がありますか? $の何かが、それはちょうどあなたが2つのプロセスあなた活用パイプまたは共有メモリや他のIPCを通信したい場合は分岐した子に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"; 
} 

答えて

9

perldoc -f fork:他のすべてがコピーされている間

ファイルディスクリプタ(および記述子に関連するロック)、共有されています。

perldoc perlipcにも表示してください。

更新:第2の考えでは、このようなものが欲しいですか?

#!/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"; 
} 

出力:

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

変数は、通常、プロセス間で共有されていない睡眠中にループして、この中にセットされますように見えることはありません。

+2

海賊版の本にリンクしないでください。 –

+1

通知していない、ごめんなさい –

0

私はあなたがスレッドを使用したいと考えています。プロセスはスレッドではありません(ただし、ある時点では、Linuxスレッドは、親とメモリを共有する特別なタイプのプロセスを使用して実装されていました)。

+2

デフォルトでは、perlスレッドのすべての変数はスレッドローカルです。詳細はperldoc threads :: sharedを参照してください。 – bdonlan

+1

私はそれを非常に疑います。 Perlスレッドのユースケースはほとんどありません。 – ysth

+1

@ysth並列タスク間でデータを共有することもその一つです。 – Schwern

1

変数への読み取り/書き込みアクセスのように見えるインターフェイスを使用して複数のプロセス間で状態を共有したい場合は、IPC::Shareableを参照してください。

0

いくつかの選択肢があります。 Threads,sockets,IPCとなり、ファイルをロックしてファイルに書き込みます。個人的に私はスレッドを推奨しています。Perlでは非常に簡単で安全です。ほとんどのインストールではコンパイルされていて、スレッドが作成されるとかなりパフォーマンスが向上します。

興味深いのは、fork()とソケットの組み合わせを使用してスレッドをエミュレートするモジュールforksです。私はそれを自分で使ったことはありませんが、Elizabeth Mattijsenは自分のスレッドを知っています。

関連する問題