4

フォークされたプロセス間で同じ変数を共有するにはどうすればよいですか?または、親のファイルに書き込み、ファイルが存在したら子のファイルに保存された値を読み取る必要がありますか?$ somethingがこれに設定されることはないので、スリープ状態でループするだけです

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

5 に答える 5

9

perldoc -f fork

ファイル記述子(および場合によってはそれらの記述子のロック)は共有されますが、他のすべてはコピーされます。

の「自分との双方向通信」も参照してくださいperldoc perlipc

更新:考え直して、あなたはこのようなものが欲しいですか?

#!/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
于 2009-08-11T14:17:45.437 に答える
6

通常、変数はプロセス間で共有されません。2つのプロセスを通信する場合は、パイプ、共有メモリ、またはその他のIPCを使用することをお勧めします。

于 2009-08-11T14:16:09.840 に答える
1

表面的には変数への読み取り/書き込みアクセスのように見えるインターフェースを使用して、複数のプロセス間で状態を本当に共有したい場合は、を確認することをお勧めしますIPC::Shareable

于 2009-08-11T14:26:32.333 に答える
0

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

于 2009-08-11T14:21:22.250 に答える
0

いくつかのオプションがあります。 スレッドソケットIPC、およびファイルロックを使用したファイルへの書き込み。個人的にはスレッドをお勧めします。Perlでは非常に簡単で安全です。ほとんどのインストールではスレッドがコンパイルされており、スレッドが作成されるとかなりパフォーマンスが向上します。

興味深い代替手段は、fork()とソケットの組み合わせを使用してスレッドをエミュレートするforksモジュールです。私はそれを自分で使ったことがありませんが、エリザベス・マティセンは彼女のスレッドを知っています。

于 2009-08-11T15:36:04.537 に答える