ロックについて

Linux, Solaris では強制ロックが実装されている。
FreeBSD, NetBSD, OpenBSD, Darwin では強制ロックは実装されていない。

flockLinux, 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