Consider the following snippet (error handling missing on purpose):
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;
}
So, the idea is to open a file, mmap()
it and return just the data pointer. It would be great if the file could be locked for mmap-time too.
Per mmap(3p)
:
The mmap() function shall add an extra reference to the file associated with the file descriptor fildes which is not removed by a subsequent close() on that file descriptor. This reference shall be removed when there are no more mappings to the file.
But per lockf(3p)
:
File locks shall be released on first close by the locking process of any file descriptor for the file.
So, using lockf()
I'd have to keep the fd open and carry its reference for an awfully long time. Is there a better portable method to ensure the file is locked till munmap()
is called?
Try using flock(2), whose documentation says "the lock is released either by an explicit LOCK_UN operation on any of these duplicate descriptors, or when all such descriptors have been closed."
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With