ロックについて
Linux, Solaris では強制ロックが実装されている。
FreeBSD, NetBSD, OpenBSD, Darwin では強制ロックは実装されていない。
flock は Linux, BSD どちらでも使え、必ずアドバイザリロック。
Linux
1. -o mand つきでマウントし
mount -t ext3 -o defaults,mand /dev/sda10 /ftp
2. chmod g-x,g+s する。(S に注目)
chmod g-x,g+s Makefile -rw-rwSr-- 1 aoyama aoyama 104 3月 3 11:35 Makefile
と lockf が強制ロックになる。
テストコード(mandlock.c)
#include <sys/types.h> #include <sys/fcntl.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char *argv[]) { char* filename = NULL; int fd = -1; if (argc < 2) { fprintf(stderr, "Usage: %s FILE\n", argv[0]); exit(1); } filename = argv[1]; fd = open(filename, O_WRONLY); if (fd < 0) { perror("open"); exit(1); } if (lockf(fd, F_LOCK, 0) != 0) { perror("lock error"); exit(1); } printf("lock %d\n", getpid()); usleep(10*1000*1000); if (lockf(fd, F_ULOCK, 0) != 0) { perror("unlock error"); exit(1); } printf("unlock %d\n", getpid()); close(fd); return 0; }
テスト
/ftp/lock:glb$ ./mandlock Makefile& [1] 10324 lock 10324 /ftp/lock:glb$ echo hogehgoe >> Makefile unlock 10324 [1]+ Done ./mandlock Makefile /ftp/lock:glb$ cat Makefile all: flock mandlock flock: flock.c gcc -o $@ $< mandlock: mandlock.c gcc -o $@ $< hogehgoe
ロックが解除されるまで echo が待たされるが、ちゃんと書きこまれている。
参考
http://www.linux.or.jp/JF/JFdocs/kernel-docs-2.6/locks.txt.html
http://www.linux.or.jp/JF/JFdocs/kernel-docs-2.6/mandatory.txt.html
flock(), fcntl() - ぐらめぬ・ぜぷつぇんのはてダ
http://d.hatena.ne.jp/msakamoto-sf/20080203/1202047000
flock(),fcntl()とアドバイザリ・ロックについての短いまとめ - ぐらめぬ・ぜぷつぇんのはてダ
http://d.hatena.ne.jp/msakamoto-sf/20080204/1202054219