The following code uses Win32::Semaphore to do what you want.
use strict;
use Win32::Semaphore;
#Determine the programe name, $progname
my $progpath = $0;
my $progname=lc($0);
if($progname=~/[\/\\]/){
my @stmp=split(/[\/\\]/,$progname);
$progname=pop(@stmp);
}
$progpath=~s/\\/\//g;
$progpath=~s/\/$progname$//is;
$progpath=~s/\//\\/g;
$progname=~s/\Q$progpath\E//s;
$progname=~s/^[\\\/]+//s;
if($progname=~/(.+?)\.(exe|pl|so)/is){$progname=$1;}
#Check to see if a semaphore with this program is already open, if so
+die.
if(Win32::Semaphore->open($progname)){
print "$progname is already running\n";
exit;
}
#Create a semaphore before starting anything else.
my $sObject;
print "creating semaphore $progname\n";
Win32::Semaphore::Create($sObject,1,1,$progname) || die "Die: $!\n";
##############################################################
########## Program Code goes below here ####################
##############################################################
while(1){
#sample pause loop so that the program does not die
select(undef,undef,undef,.01);
}
exit;
##############################################################
END {
if($sObject){$sObject->Release();}
}
|