考虑以下代码片段(故意省略了错误处理):
因此,这个想法是打开一个文件,
根据
引用源自与文件描述符fildes相关联的文件的新映射,该引用不会被随后对该文件描述符的close()调用删除。只有当没有更多的映射到该文件时才会删除此引用。
但根据
由任何一个文件描述符对该文件进行的第一次关闭操作都将释放文件锁。
因此,使用
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()
之前被锁定?
flock()
的工作效果符合预期,但我担心它的可移植性。一个问题是它在哪里可用,另一个问题是:其他(非glibc)实现是否会做相同的事情。我在BSD手册中没有看到任何具体信息,但似乎它不会保持这种效果。 - Michał Górny