いいじまです。

> > WINDOWS95でも、排他制御できるPerlってないですか?
> 
> Win95 なんか捨てろよってのはおいといて...

まあまあ。

ActivePerl は Windows 95 で動きますけど、それではダメですか?

Perl 5.6.1 ないし 5.8.0 ベースのものがほしければ、こちら。
http://www.activestate.com/Products/ActivePerl/

JPerl(これは Perl 5.005_03 ベースのものしかありません)がほしければ、こちら。
http://homepage2.nifty.com/kipp/perl/jperl/

                                ☆

で、本題。
UNIX なら各プロセスの間での排他制御には symlink() を使うのが常道なんです
が、Windows には symlink() はないので、

> Perl はWin32API を呼べるので、それを使えばいいんじゃないですか?

ということになりますね。
open() を使うロック方法ではきちんと排他制御はできませんので。

Win32::API モジュールを使って、CreateFileA API を使うことになるでしょう。
ちょっと試してみたところ、こんな感じでいけそうです。

use Win32::API;
$CreateFileA = new Win32::API('kernel32','CreateFileA',
        [P,     # LPCTSTR lpFilename
         N,     # DWORD dwDesiredAccess - use GENERIC_WRITE
         N,     # DWORD dwShareMode - use zero for sharing with nobody else
         N,     # LPSECURITY_ATTRIBUTES lpSecurityArrtibutes - use NULL here
         N,     # DWORD dwCreationDistribution - use CREATE_NEW
         N,     # DWORD dwFlagsAndAttributes - use FILE_ATTRIBULE_NORMAL
         N],    # HANDLE hTemplateFile - use NULL here
        N);
$CloseHandle = new Win32::API('kernel32', 'CloseHandle', [N], N);

$GENERIC_WRITE = 0x40000000;
$CREATE_NEW = 1;
$FILE_ATTRIBUTE_NORMAL = 0x80;
$INVALID_HANDLE_VALUE = -1;

$hFile = $CreateFileA->Call('.\lockfile', $GENERIC_WRITE, 0, 0, $CREATE_NEW,
                $FILE_ATTRIBUTE_NORMAL, 0);

if ($hFile == $INVALID_HANDLE_VALUE)
{
        die "lock failed\n";
}
else
{
        print "lock success. press Enter to unlock:";
        $temp = <>;
        $CloseHandle->Call($hFile);
        unlink '.\lockfile';
}

========================================================================
飯嶋 浩光 / でるもんた・いいじま   http://www.ht.sakura.ne.jp/~delmonta/
IIJIMA Hiromitsu, aka Delmonta           mailto:delmonta@ht.sakura.ne.jp