Re: 排他制御
いいじまです。
> > 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
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735