【问题标题】:why vi can modify a file while this file is write locked?为什么vi可以在文件被写锁定时修改文件?
【发布时间】:2013-08-10 08:04:55
【问题描述】:

我编译这个文件并在一个控制台中运行它。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
                /* l_type   l_whence  l_start  l_len  l_pid   */
    struct flock fl = {F_WRLCK, SEEK_SET,   0,      0,     0 };
    int fd;

    fl.l_pid = getpid();

    if (argc > 1) 
        fl.l_type = F_RDLCK;

    if ((fd = open("lockdemo.c", O_RDWR)) == -1) {
        perror("open");
        exit(1);
    }

    printf("Press <RETURN> to try to get lock: ");
    getchar();
    printf("Trying to get lock...");

    if (fcntl(fd, F_SETLKW, &fl) == -1) {
        perror("fcntl");
        exit(1);
    }

    printf("got lock\n");
    printf("Press <RETURN> to release lock: ");
    getchar();

    fl.l_type = F_UNLCK;  /* set to unlock same region */

    if (fcntl(fd, F_SETLK, &fl) == -1) {
        perror("fcntl");
        exit(1);
    }

    printf("Unlocked.\n");

    close(fd);

    return 0;
}

它输出:

ZJ:~/Documents/c$ ./a.out
press <RETURN> to try to get lock: 
Trying to get lock...got lock
press <RETURN> to release lock:

我打开另一个控制台并 vi lockdemo.c 并成功修改了 lockdemo.c。为什么?这个文件不是被锁了吗? 当我打开另一个控制台时

ZJ:~/Documents/c$ ./a.out
press <RETURN> to try to get lock: 

a.out 一直在运行 getchar(),甚至无法执行 printf("正在尝试获取锁..."); 我完全糊涂了。

【问题讨论】:

  • 在某些系统上提供了三种不同的锁定机制,其中两种由 POSIX 指定。有fcntl和lockf,虽然后者还是比较新的,至少在Linux的情况下,还有flock函数。当然,所有这些都是建议性的。锁定文件实际上并不意味着它看起来。如果另一个进程使用另一个锁定功能,则无法保证您的进程一定可以安全地读取/写入文件。在强制锁的情况下,它们在 Linux 上仍然不可靠(参见BUGS

标签: unix locking


【解决方案1】:

您正在对 lockdemo.c 文件应用 advisory 锁定。 vi 可以随意忽略它。您应该使用 AFAIK 在 Unix 下未标准化的 强制 锁来强制 vi 不这样做。

【讨论】:

  • 如果无法保护文件免遭修改,建议锁定的意义何在?
  • 假设与红绿灯相同的点,红灯时不能更好地防止过马路。
  • 我认为@jlliagre 提出了一个很好的观点:红色交通信号灯不会阻止汽车穿过十字路口,但我们相信他们会用我们的生命。这是一个真实的咨询锁示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 2017-06-18
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
相关资源
最近更新 更多