その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

Windows で flock の LOCK_EX + LOCK_NB のような感じでファイルロックする

"windows LOCK_NB" とかでぐぐると無限に PHP の情報がヒットしてなかなか所望の情報に辿りつけなかったのだけれど,どうやら LockFileEx を使えば良いらしい.
LockFileEx function (Windows)


LOCKFILE_EXCLUSIVE_LOCK (0x00000002) を dwFlags に指定してやるとファイルを排他ロックすることができ (指定しない場合は共有ロック),LOCKFILE_FAIL_IMMEDIATELY (0x00000001) を指定するとロックを取得できなかったら即座に失敗を返してくるようになる (指定しない場合はロックが得られるまで待つ).つまり,これらは flock の LOCK_EX と LOCK_NB に対応していると言える.
つまり,以下のように使うと flock の LOCK_EX | LOCK_NB 相当の事ができる (コードはここから持ってきた:
Locking and Unlocking Byte Ranges in Files (Windows)).

fSuccess = LockFileEx(hFile,         // exclusive access, 
                      LOCKFILE_EXCLUSIVE_LOCK | 
                      LOCKFILE_FAIL_IMMEDIATELY,
                      0,             // reserved, must be zero
                      TESTSTRLEN,    // number of bytes to lock
                      0,
                      &sOverlapped); // contains the file offset


便利便利.

go-setlock - Go port of setlock

[2015/08/10 12:47 追記]なんか一部のOS Xで動かないので調査中です……
[2015/08/11 10:15 追記]v1.1.0で直っています


setlockdaemontools に同梱されているコマンドラインツールで,非常に便利かつ強力なツールであることが知られています.この件については以下の記事などが参考になります.


そしてこの度,その setlock を golang で移植した go-setlock というものをこさえました.

go-setlock は setlock と同等の機能を持っており,かつ以下の様なメリットが挙げられます.

  • daemontools から独立しているので,setlock のみを使いたいときにわざわざ daemontools ごとインストールする必要がない
  • Windows でも使える!!

前者は諸般の事情により daemontools をインストール出来ない環境でお暮らしの方 *1 や、ミニマリストの方にとって役立つでしょう.
後者はなかなか強力です.オリジナルの setlock は Windows 上で使えなかったわけですが,go-setlock はテクノロジにより Windows でも動作するようにしたので便利です (試しに Windows のメディアサーバ上で動画のエンコードを排他的に行う,みたいな事をやってみたんですが便利).


使い方はオリジナルの setlock と揃えています.README.mdmanual of the original setlock をご参照ください.
ご利用くださいませ.

*1:そんな環境があるのか

go-setlock - Go port of setlock

setlock is a command line tool which is in daemontools. That tool is known as powerful and useful.


Then I implemented setlock command by golang, called go-setlock.

go-setlock has functions which are equivalent to the original setlock. And go-setlock has following pros;

The former is useful for environments which cannot install daemontools, minimalists and etc.
The latter is pretty powerful. The original setlock is not available on Windows however go-setlock can use on there.


Usage is matched to the original setlock. Please refer README.md and manual of the original setlock.
Enjoy!