mmap()和文件锁定

7
考虑以下代码片段(故意省略了错误处理):
void* foo(const char *path, off_t size) {
    int fd;
    void *ret;

    fd = open(path, O_RDWR);
    lockf(fd, F_LOCK, 0);
    ret = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

    close(fd);
    return ret;
}

因此,这个想法是打开一个文件,mmap()它并返回数据指针。如果在mmap时间内能锁定文件就更好了。
根据mmap(3p)
引用源自与文件描述符fildes相关联的文件的新映射,该引用不会被随后对该文件描述符的close()调用删除。只有当没有更多的映射到该文件时才会删除此引用。
但根据lockf(3p)
由任何一个文件描述符对该文件进行的第一次关闭操作都将释放文件锁。
因此,使用lockf(),我必须保持fd打开,并携带其引用很长时间。是否存在更好的可移植方法来确保文件在调用munmap()之前被锁定?
2个回答

5

尝试使用flock(2),其文档中写道:"锁定会在任何一个副本描述符上执行显式的LOCK_UN操作或所有这些描述符都关闭时释放。"


是的,flock() 的工作效果符合预期,但我担心它的可移植性。一个问题是它在哪里可用,另一个问题是:其他(非glibc)实现是否会做相同的事情。我在BSD手册中没有看到任何具体信息,但似乎它不会保持这种效果。 - Michał Górny
你想让这个程序在哪些平台上运行?你是否愿意为不同的平台采用不同的解决方案(例如使用条件编译)? - John Zwinck
嗯,针对这个特定项目,我正在针对 POSIX 进行开发 - 主要是 Linux,可能还包括一些 BSD。不同解决方案的主要问题在于它们需要改变库 API。 - Michał Górny
1
那我建议你务实一点:flock(2) 在 Linux 上可以运行,我敢打赌在 BSD 上也可以运行(你只需要测试一下)。 - John Zwinck

0

没有,你有几个选择,按易用性排序:

  • 保持fd打开。
  • 在映射区域内放置互斥锁。
  • 使用单独的锁文件。

我不会在这里详细介绍它们,因为其他问题已经更好地描述了它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接