C mmap()和锁定文件

C mmap()和锁定文件,c,locking,posix,mmap,C,Locking,Posix,Mmap,考虑以下代码段(故意丢失错误处理): 因此,我们的想法是打开一个文件,mmap()it,然后只返回数据指针。如果文件也能在mmap时间内被锁定,那就太好了 按照mmap(3p): 函数的作用是:向与 文件描述符fildes未被该文件上的后续close()删除 描述符。当没有更多到的映射时,应删除此引用 档案 但是根据锁(3p): 文件锁应在任何文件的锁定过程中第一次关闭时释放 文件的描述符 因此,使用lockf()我必须保持fd打开,并在很长一段时间内携带其引用。是否有更好的可移植方法来确保在调

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

因此,我们的想法是打开一个文件,
mmap()
it,然后只返回数据指针。如果文件也能在mmap时间内被锁定,那就太好了

按照
mmap(3p)

函数的作用是:向与 文件描述符fildes未被该文件上的后续close()删除 描述符。当没有更多到的映射时,应删除此引用 档案

但是根据
锁(3p)

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


因此,使用
lockf()
我必须保持fd打开,并在很长一段时间内携带其引用。是否有更好的可移植方法来确保在调用
munmap()
之前锁定文件?

尝试使用,其文档说明“通过对这些重复描述符中的任何一个进行显式锁定操作,或者在关闭所有此类描述符时释放锁。”

不,没有。为了便于使用,您有几个选项:

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

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

是的,
flock()
工作正常,但我担心它的可移植性。一件事是它在哪里可用,另一件事是:其他(非glibc)实现是否也会这样做。我在BSD手册页上没有看到任何关于这方面的具体信息,但它似乎无法保存它。您希望在哪些平台上使用它?您是否愿意为不同的平台提供不同的解决方案(例如,使用条件编译)?好的,对于这个特定的项目,我的目标是POSIX-主要是Linux,可能是一些BSD。不同解决方案的主要问题是它们需要更改库API。然后我建议您务实一点:flock(2)将在Linux上工作,我打赌它也将在BSD上工作(您只需测试它)。
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;
}