#!/usr/bin/perl use warnings; use strict; use Time::HiRes qw( gettimeofday usleep ); use Fcntl qw( :DEFAULT :flock ); ## Part of core perl my $file = "/dev/shm/FlexBase/__env.index"; # my $file = "/__env.index"; # my $file = "/flexvault/__env.index"; our $PREFORK = 0; our $children = 0; our @CHILDREN = (); our $list = ""; for $PREFORK ( 1..6 ) { open( my $indexdb,">", $file ) or die "Not open1: $!"; close $indexdb; $SIG{CHLD} = 'IGNORE'; $children = 0; @CHILDREN = (); $list = ""; my $stime = gettimeofday; for ( 1 .. $PREFORK ) { my $pid = fork; if ( $pid ) { # parent $CHILDREN[$children] = $pid; $children++; if ( $list ) { $list .= ", $pid"; } else { $list = $pid; } } elsif ( defined $pid ) { # child sysopen( $indexdb, $file, O_RDWR | O_SYNC | O_NONBLOCK ) or die "Not open2: $!"; my $i = 0; while( 1 ) { &write_mem($indexdb, $i); $i++; if ( $i >= 1_000_000 ) { last; } } close $indexdb; exit; } else { die "Can't fork: $!"; } } print "$PREFORK children started by $$: $list\n"; while ( 1 ) { usleep 15000; my $child = 0; for my $no ( 0..$#CHILDREN ) { my $pid = $CHILDREN[$no] + 0; if ( kill 0 => $pid ) { $child++; } } if ( $child == 0 ) { last; } } my $Total = $PREFORK * 1_000_000; $stime = gettimeofday - $stime; my $rpm = int( $Total / $stime ); print " $Total $stime $rpm/second \`cat $file\` = "; system("cat $file"); print "\n"; } unlink $file; exit; sub write_mem() { # Write a string to the shared file. my $indexdb = shift; my $message = shift; if ( flock( $indexdb, LOCK_EX ) ) { my $ret = sysseek( $indexdb, 0, 0); # move to beginning of file if ( ! defined $ret ) { die "$$ O04. $message sysseek failed: $!\n"; } $ret = syswrite ( $indexdb, $message, length($message), 0 ); if ( $ret != length($message) ) { die "$$ O05. $message|$ret syswrite failed! $!\n"; } flock( $indexdb, LOCK_UN ); } else { print "$$ O07. flock failed! $!"; } return 0; } 1; __END__