$IPC_PRIVATE = 0; $IPC_RMID = 0; $size = 2000; $key = shmget($IPC_PRIVATE, $size , 0777 ); die unless defined $key; $message = "Message #1"; shmwrite($key, $message, 0, 60 ) or die "shmwrite: $!"; shmread($key,$buff,0,60) or die "shmread: $!"; print $buff,"\n"; print "deleting $key\n"; shmctl($key ,$IPC_RMID, 0) or die "shmctl: $!"; ***** $IPC_KEY = 1234; $IPC_RMID = 0; $IPC_CREATE = 0001000; $key = semget($IPC_KEY, $nsems, 0666 | $IPC_CREATE ); die if !defined($key); print "$key\n"; ***** # create a semaphore $IPC_KEY = 1234; $key = semget($IPC_KEY, 0, 0 ); die if !defined($key); $semnum = 0; $semflag = 0; # 'take' semaphore # wait for semaphore to be zero $semop = 0; $opstring1 = pack("sss", $semnum, $semop, $semflag); # Increment the semaphore count $semop = 1; $opstring2 = pack("sss", $semnum, $semop, $semflag); $opstring = $opstring1 . $opstring2; semop($key,$opstring) or die "semop: $!"; ***** # 'give' the semaphore # run this in the original process and you will see # that the second process continues $IPC_KEY = 1234; $key = semget($IPC_KEY, 0, 0); die if !defined($key); $semnum = 0; $semflag = 0; # Decrement the semaphore count $semop = -1; $opstring = pack("sss", $semnum, $semop, $semflag); semop($key,$opstring) or die "semop: $!";