mr_p has asked for the wisdom of the Perl Monks concerning the following question:
Hello Monks,
I am working on a program that forks 3 childern. The first child acts as a perent to the next two.
Job for the first Child:
- Update a Variable called dirListing.
- Checks filesDownloaded array and takes action based on filename.
Job for two childern:
- Check dirListing array content and take action based on the filename.
- If action is taken then added filename to filesDownloaded array.
when I run the program I keep getting the following error.
Can't use an undefined value as an ARRAY reference at /shmem/lib/lib/perl5/site_perl//5.8.5/IPC/Shareable.pm line 446. IPC::Shareable::FETCHSIZE('IPC::Shareable=HASH(0x79baf0)') called at ./test_nfxftpd line 63
Please help, I have watsed so much time with this, Thanks in advance.
#! /usr/bin/perl -w use strict; use lib "/nss/nfx/shmem/lib/lib"; use lib "/nss/nfx/shmem/lib/lib64"; use lib "/nss/nfx/shmem/lib/lib/perl5/site_perl/"; use File::Basename; use Getopt::Long; use File::Copy; use strict; #use IPC::Shareable; use IPC::Shareable qw(); my $child; my $serv_id; my $maxRcvrCount; my $stripeInstance; my $maxStripeInstance; my $user; my @ftpDirectoryListing=(); my @dirListing=(); my @filesDownloaded=(); my $glue = 'data'; my %options = ( create => 1, exclusive => 0, mode => 0644, destroy => 1, ); my $dirListingHandle = tie @dirListing, 'IPC::Shareable', 'data', \%op +tions; my $filesDownloadedHandle = tie @filesDownloaded, 'IPC::Shareable', 'k +ala', \%options; sub pollDaemonParent { my $user = $_[0]; my @previousListing=(); my @currentListing=(); while (1) { @previousListing = @currentListing; @currentListing = getListing($user); $dirListingHandle->shlock(); @dirListing = deDupArray1(\@previousListing, \@currentListing) +; print "Parent: currentListing: @currentListing dirListing: +@dirListing\n"; $dirListingHandle->shunlock(); deleteRemoteFiles1(); select (undef, undef, undef,.5); } } sub deleteRemoteFiles1 { # TODO: Get list and delete from server. once deleted $filesDownloadedHandle->shlock(); if ($#filesDownloaded >= 0) { print "\nParent: deleteListing: @filesDownloaded\n"; } foreach (@filesDownloaded) { deleteFile($_); } @filesDownloaded=(); $filesDownloadedHandle->shunlock(); } sub pollDaemonChild { my $user = $_[0]; print "ChildStarted: $stripeInstance\n"; while (1) { @ftpDirectoryListing = (); $dirListingHandle->shlock(); @ftpDirectoryListing = @dirListing; $dirListingHandle->shunlock(); if ($#ftpDirectoryListing >= 0) { print "Child - @ftpDirectoryListing: @ftpDirectoryListing\ +n"; } select (undef, undef, undef,1); } } sub getListing { my @ftpListing1 = (); push (@ftpListing1, "abc.xml"); push (@ftpListing1, "xyz.xml"); return @ftpListing1; } sub deDupArray1 { my @difference = ("dedup1.xml", "dedup2.xml"); return @difference; } sub addToDeleteList { $|++; $filesDownloadedHandle->shlock(); push (@filesDownloaded, "$_[0]"); $filesDownloadedHandle->shunlock(); } # main { $user = "IAmUser"; $serv_id = "1"; $maxRcvrCount = "5"; $stripeInstance = "1" ; $maxStripeInstance = "3"; $SIG{'ALRM'} = 'sig_alrm'; my $startingInstanceNum=1; my @kids; for (1 .. $maxStripeInstance) { $stripeInstance = $startingInstanceNum; print "stripeInstance: $startingInstanceNum\n"; unless ($child = fork) { # i'm the child die "cannot fork: $!" unless defined $child; if($stripeInstance == 1 ) { pollDaemonParent($user); } else { pollDaemonChild($user); } exit; } push @kids, $child; # in case we care about their pids $startingInstanceNum++; } while (1) { sleep 1; } }
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: Shared Memory using IPC::Shareable - Can't use an undefined value as an ARRAY reference
by zentara (Cardinal) on Feb 18, 2010 at 13:15 UTC | |
Re: Shared Memory using IPC::Shareable - Can't use an undefined value as an ARRAY reference
by rowdog (Curate) on Feb 18, 2010 at 01:57 UTC |