Chinaunix首页 | 论坛 | 博客
  • 博客访问: 203995
  • 博文数量: 4
  • 博客积分: 1402
  • 博客等级: 上尉
  • 技术积分: 302
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-16 18:31
文章分类

全部博文(4)

文章存档

2008年(4)

我的朋友

分类: LINUX

2008-03-27 17:41:14

   Linux文件锁的几个要点
Du XiaoGang

    文件锁是Linux上最常用的进程间同步机制之一,相比sysv的信号量,文件锁更容易使用(sysv信号量的麻烦之处在于它的key获取机制)。
   
    APUE对文件锁做了详尽的描述,其中需要注意的有以下几点,原文可参见APUE2的14.3节:

    1,文件锁(file_lock)与文件(确切的说是文件的inode)及进程捆绑,Linux实现中文件的file_lock结构挂在该文件对应的inode结构中,而file_lock结构中包含了该锁所属进程的pid。这种实现方式造成了两种后果:

        a, 进程退出时,属于该进程的所有文件锁被释放。

        b, 关闭加锁进程所属的任何一个指向加锁文件的fd或file时,锁被释放。这是由于file_lock结构选择挂
在inode上而不是fd或file(内核结构,fd的下一站),所以无法具体区分文件锁对应的fd或file上。这点需要特别注意,APUE上列出了两个例子,第一个对应fd关闭,第二个对应file关闭,这两种情形都会导致锁释放:

            fd1 = open(pathname, ...);
            read_lock(fd1, ...);
            fd2 = dup(fd1);
            close(fd2);
   
            fd1 = open(pathname, ...);
            read_lock(fd1, ...);
            fd2 = open(pathname, ...)
            close(fd2);

       APUE中有一个FreeBSD的文件锁实现图可以帮助理解以上内容,该图对Linux也是适用的。

    2,fork()后子进程不继承父进程的锁,这个很容易理解,锁就是被进程用来执行互斥等任务的,如果承就乱了。

    3,exec()可以继承锁,取决于exec()后加锁fd是否被关闭(close-on-exec),这是因为exec()前后进程还是
一个。
阅读(2067) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~