设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客

Linux中的两种文件锁—协同锁与强制锁

2012-4-24 10:24| 发布者: 红黑魂| 查看: 3878| 评论: 0|来自: 伯乐在线

摘要: 文件锁是一种文件读写机制,在任何特定的时间只允许一个进程访问一个文件。利用这种机制能够使读写单个文件的过程变得更安全。在这篇文章中,我们将探讨Linux中不同类型的文件锁,并通过示例程序来理解它们之间的不 ...
Linux文件锁的示例
为了理解文件锁是如何工作的,我们建立程序文件file_lock.c:
#include <stdio.h>
#include <fcntl.h>
 
int main(int argc, char **argv) {
  if (argc > 1) {
    int fd = open(argv[1], O_WRONLY);
    if(fd == -1) {
      printf("Unable to open the file\n");
      exit(1);
    }
    static struct flock lock;
 
    lock.l_type = F_WRLCK;
    lock.l_start = 0;
    lock.l_whence = SEEK_SET;
    lock.l_len = 0;
    lock.l_pid = getpid();
 
    int ret = fcntl(fd, F_SETLKW, &lock);
    printf("Return value of fcntl:%d\n",ret);
    if(ret==0) {
      while (1) {
        scanf("%c", NULL);
      }
    }
  }
}
 用gcc编译此程序:
# cc -o file_lock file_lock.c
使用mount命令带“mand”参数来重新挂载根文件系统,如下所示。这将在文件系统级别使能强制锁功能。注意:你必须切换到root用户才能执行下面的命令。
# mount -oremount,mand /
在可执行的(file_lock所在的)目录中创建两个名为“advisory.txt”和“mandatory.txt”的文件。对于“mandatory.txt”使能Set-Group-ID,同时不使能Group-Execute-Bit,如下所示:
# touch advisory.txt
# touch mandatory.txt
# chmod g+s,g-x mandatory.txt
测试协同锁:执行示例程序,以“advisory.txt”作为参数。
# ./file_lock advisory.txt
此程序将等待用户的输入。从另一个终端或控制台,尝试输入以下命令行:
# ls >>advisory.txt
在上面的例子中,ls命令会将其输出写入到advisory.txt文件中。即使我们获得了一个写入锁,仍然会有一些进程(非合作)能够往文件里写入数据。这就是所谓的“协同”锁。
 
测试强制锁:再次执行示例程序,以“mandatory.txt”作为参数。
# ./file_lock mandatory.txt
从另一个终端或控制台,尝试输入以下命令行:
# ls >>mandatory.txt
在上面的例子中,ls命令在将其输出写入到mandatory.txt文件之前,会等待文件锁被删除。虽然它仍然是一个非合作进程,但强制锁起了作用。

英文原文:Lakshmanan Ganapathy    编译:伯乐在线 – 肖翔

酷毙
1

雷人

鲜花

鸡蛋

漂亮

刚表态过的朋友 (1 人)

  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部