mmap()和锁定文件

时间:2011-11-20 16:01:18

标签: c locking posix mmap

考虑以下代码段(错误处理故意丢失):

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)

  

mmap()函数应该添加对与之关联的文件的额外引用   文件描述符fildes不会被该文件上的后续close()删除   描述。当没有更多映射时,应删除此引用   文件。

但是根据lockf(3p)

  

文件锁应在第一次关闭时通过任何文件的锁定过程释放   文件的描述符。

所以,使用lockf()我必须保持fd打开并在非常长的时间内引用它。有没有更好的可移植方法来确保文件被锁定直到调用munmap()

2 个答案:

答案 0 :(得分:5)

尝试使用flock(2),其文档说“通过对任何这些重复描述符的显式LOCK_UN操作释放锁定,或者当所有此类描述符都已关闭时。”

答案 1 :(得分:0)

不,没有。根据易用性,您有几个选择:

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

我不会在这里详细介绍它们,还有其他问题可以更好地描述它们。