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

你有几个选择。 ThreadssocketsIPC和写入带有文件锁定的文件。我个人推荐线程,它们在 Perl 中非常简单和安全,大多数安装都编译了它们,并且一旦创建了线程,它们的性能就相当不错。

一个有趣的替代方案是forks模块,它使用 fork() 和套接字的组合来模拟线程。我自己从未使用过它,但 Elizabeth Mattijsen 知道她的线程。

于 2009-08-11T15:36:04.537 回答