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 编译:伯乐在线 – 肖翔 |