[plug] [OT] Perl Sub Modify Global Variable

Timothy White weirdo at tigris.org
Wed Feb 9 15:31:14 WST 2005


Ok. Still no luck.
It appears that because I am forking I can't share between forks. This
is a real bummer.
It is especially annoying because I am writing a forking server to
handle requests and I want the user_database to be shared between them all.

Any ideas?

Tim
NB: Sorry anyone who pays per kb, I know I should just post the code on
a website.
p.s. I tried a small test script[2] to see if I could get the global and
forking working. below are the results[1].
Basically I have a fork which runs 2 subs. One of the subs sits there
monitoring the variable and changing it to a preset value each time. The
other sub calls 2 subs, one after the other, each one checks the
variable and then updates it.
[1]
Loading user db...      127.0.0.1
Monitoring user...      127.0.0.1       Done... 192.168.0.1
Updating user...        127.0.0.1       Done... 192.168.0.2
Checking user...        192.168.0.2     Done... 192.168.0.3
Monitoring user...      192.168.0.1     Done... 192.168.0.1
Updating user...        192.168.0.3     Done... 192.168.0.2
Checking user...        192.168.0.2     Done... 192.168.0.3
Monitoring user...      192.168.0.1     Done... 192.168.0.1
Monitoring user...      192.168.0.1     Done... 192.168.0.1
Updating user...        192.168.0.3     Done... 192.168.0.2
Checking user...        192.168.0.2     Done... 192.168.0.3
Monitoring user...      192.168.0.1     Done... 192.168.0.1
Monitoring user...      192.168.0.1     Done... 192.168.0.1
Updating user...        192.168.0.3     Done... 192.168.0.2
Checking user...        192.168.0.2     Done... 192.168.0.3
Monitoring user...      192.168.0.1     Done... 192.168.0.1


[2]
use strict vars;
our %userdb;

load_user_database(); # This appears to work for the inital loading into
$userdb

my $pid = fork();
if ($pid) {
    modify();
}
else {
    user_monitor();
}

sub modify {
    while () {
        my $user = 'tim';
        my $ip   = '192.168.0.2';    # Normally get this from other areas
        user_update( $user, $ip );
        user_check($user);
        sleep 1;
    }
}

sub user_update {
    my $user = shift(@_);
    my $ip   = shift(@_);
    print "Updating user...\t"
      . $userdb{$user}
      ->{'ip'};    #Prints out 127.0.0.1 first time, then 192.168.0.3
    $userdb{$user}->{'ip'} = $ip;
    print "\tDone... "
      . $userdb{$user}->{'ip'}
      . "\n";      #Prints out 192.168.0.2 every time
    return 1;
}

sub user_monitor {
    while () {
        my $user = 'tim';
        print "Monitoring user...\t"
          . $userdb{$user}
          ->{'ip'};    #Prints out 127.0.0.1 first time, then 192.168.0.1
        $userdb{$user}->{'ip'} = "192.168.0.1";
        print "\tDone... "
          . $userdb{$user}->{'ip'}
          . "\n";      #Prints out 192.168.0.1 every time
        sleep 1;
    }
}

sub load_user_database {
    $userdb{'tim'}->{'ip'} = "127.0.0.1";
    print "Loading user db...\t" . $userdb{'tim'}->{'ip'} . "\n";
}

sub user_check {
    my $user = 'tim';
    print "Checking user...\t"
      . $userdb{$user}
      ->{'ip'};    #Prints out 127.0.0.1 first time, then 192.168.0.2
    $userdb{$user}->{'ip'} = "192.168.0.3";
    print "\tDone... "
      . $userdb{$user}->{'ip'}
      . "\n";      #Prints out 192.168.0.1 every time
    sleep 1;
}

--
Tim White - Use the Fox, Luke!
PGP/GPG id: 602E944D, Pub Key Serv: subkeys.pgp.net
Fingerprint: 04C2 9682 B7B2 3006 009D  A9F3 067E EDCD 602E 944D
Hi! I'm a .signature virus! Copy me into your ~/.signature to help me spread!
--

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: OpenPGP digital signature
URL: <http://lists.plug.org.au/pipermail/plug/attachments/20050209/be2e54e7/attachment.pgp>


More information about the plug mailing list