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;
}