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

发表于:2012-5-22 10:18

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:肖翔 译    来源:51Testing软件测试网采编

  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文件之前,会等待文件锁被删除。虽然它仍然是一个非合作进程,但强制锁起了作用。

22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号