またはその逆のケース。それぞれ Perl と PHP で書かれたプログラムがあって、その両者が同じファイルに読み書きする処理を考えます。ここで Perl の flock 命令でファイルを排他ロックをした場合、PHP から同じファイルへの読書きは PHP の flock でブロックされるのか?という疑問。
flock 命令で排他ロックしたファイルは、
ロックが開放されるまで PHP の flock 命令でブロックされます。
また逆のケースでも同じです。
#!/usr/bin/perl
use Fcntl ':flock';
$filename = './test.txt';
$ret = open (FILE, '+>'. $filename);
if ($ret) {
if (flock (FILE, LOCK_EX)) {
sleep (5);
seek (FILE, 0,0);
print FILE "Written by Perl";
}
close (FILE);
}
print "Content-type: text/plain
done.";
<?php
$filename = './test.txt';
$fp = fopen ($filename, 'w+');
if ($fp) {
if (flock ($fp, LOCK_EX)) {
sleep (5);
fseek ($fp, 0,0);
fwrite ($fp, "Written by PHP");
}
fclose ($fp);
}
?>done.
sleep 命令でflock によるロック状態を暫く保持できるようにしてあります。それぞれのプログラムを少し時間差を付けてブラウザから呼び出し、test.txt の内容をチェックします。実験に使用した環境は以下の通りです。
最終的にはどちらも同じシステムコールに行き着くわけですから、表面的な言語の違いというのは問題では無いということですね。そして言語は違えど正しくロックを行わないと効果はありませんよ、と。
お付き合いくださったマイミク三矢田さん、TOMMY山さん、ありがとうございました