またはその逆のケース。それぞれ 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山さん、ありがとうございました