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# $parent_share->remove; # $parent_share->clean_up_all;
#!/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;
In reply to Re: Semaphores leaks with IPC::Shareable
by zentara
in thread Semaphores leaks with IPC::Shareable
by losgrandes
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |