2008-03-03
■[unix]ロックについて

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
コメントを書く
トラックバック - http://d.hatena.ne.jp/parasporospa/20080303/p1
リンク元
- 17 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLJ,GGLJ:2006-48,GGLJ:ja&q=VC+最適化+#pragma+once
- 12 http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=vi+sed&num=50
- 10 http://search.yahoo.co.jp/search?p=うたまっぷ&search_x=1&tid=top_ga1&ei=UTF-8&qrw=0&pstart=1&fr=top_ga1&b=41
- 7 http://reader.livedoor.com/reader/
- 6 http://www.google.co.jp/search?q=GPG+passphrase+自動&hl=ja&lr=lang_ja&start=10&sa=N
- 5 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&q=ツリー表示+SQL&btnG=検索&lr=lang_ja
- 4 http://ezsch.ezweb.ne.jp/search/ezGoogleMain.php?query=メモ帳。&start-index=4&adpage=2&mode=02
- 4 http://www.google.co.jp/search?hl=ja&client=firefox-a&channel=s&rls=org.mozilla:ja:official&q=ブロックサイズ+調べる&btnG=検索&lr=
- 4 http://www.google.co.jp/search?sourceid=navclient&aq=t&hl=ja&ie=UTF-8&rlz=1T4HPNW_ja___JP211&q=java+http+クライアント
- 3 http://search.yahoo.co.jp/search?p=歌詞+印刷&ei=UTF-8&qrw=0&pstart=1&fr=top_ga1&b=21
