Here is a full example which I play with. It works. Notice the line
$parent_share->remove;
I run the script, then afterwards run "ipcs -a" to list ALL, and everything is cleaned up. I did run into one weirdness however, and it may be a bug. If you remove the last 2 cleanup lines
# $parent_share->remove;
# $parent_share->clean_up_all;
the script will leave behind some shmem segments that cannot be removed, even by root. Only killing the X server seems to remove it. So it seems like a zombie situation of sorts. If the running script dosn't do the cleanup, junk gets left behind. There are alot of post on google on removing shared mem segments and semaphores, and you may need to resort to using some kind of clean-up script after you run your program.
See man ipcs, and man ipcrm
#!/usr/bin/perl
use strict;
use Parallel::ForkManager;
use IPC::Shareable;
my $glue = $$;
my %options = (
create => 1,
exclusive => 0,
mode => 0644,
destroy => 1,
);
my %final_parent_hash;
my $parent_share = tie %final_parent_hash, 'IPC::Shareable', $glue, {
+%options } or die "parent : tie failed\n";
my $fork_manager = new Parallel::ForkManager(5);
foreach my $child ( 1 .. 10 ) {
my $pid = $fork_manager->start($child) and next;
my %options = (
create => 0,
exclusive => 0,
mode => 0644,
destroy => 0,
);
my %child_hash;
my $child_share = tie %child_hash, 'IPC::Shareable', $glue, { %opt
+ions } or die "client: tie failed\n";
for my $id (1 .. 20) {
my $key = $child . '-' . $id;
$child_share->shlock;
$final_parent_hash{$key} = qq{|Kid $child pushed $id};
$child_share->shunlock;
}
$fork_manager->finish($child);
}
print "Waiting for Children...\n";
$fork_manager->wait_all_children;
my $sleep_ctr = 10;
while ($sleep_ctr) {
if ((keys %final_parent_hash) == 200) {
last;
}
sleep 1;
$sleep_ctr--;
}
foreach my $child ( 1 .. 10 ) {
for my $id (1 .. 20) {
my $key = $child . '-' . $id;
if (! exists $final_parent_hash{$key} ) {
print "Missing data for Kid $child , data $id\n";
}
else {
print "$key = $final_parent_hash{$key}\n";
}
}
}
$parent_share->remove;
$parent_share->clean_up_all;
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.