Несколько процессов могут читать из файла одновременно. Достаточно редко происходит запись в файл, при этом другие процессы из него читать не должны (ну и писать тоже).
Пытаюсь организовать блокировку с помощью flock. И вот какая штука получается: когда стоит shared lock, начинаем делать exclusive lock, соответственно происходит ожидание пока shared lock пропадёт. Но засада в том, что в это время другой процесс может сделать свой shared lock, и его тоже придётся ждать.
Как бы сделать так чтоб когда начали делать exclusive lock другие процессы ждали прежде чем получить shared lock?
Вот код для наглядности:
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <sys/types.h>
int open_lockme() {
int fd = open("lockme.tmp", O_CREAT);
if (fd == -1) {
perror("failed to open \"lockme.tmp\"");
exit(EXIT_FAILURE);
}
return fd;
}
main() {
if (fork() == 0) {
if (fork() == 0) {
int fd = open_lockme(); puts("(1): trying to set shared lock");
flock(fd, LOCK_SH); puts("(1): shared lock set");
sleep(3);
close(fd); puts("(1): fd closed, shared lock removed");
}
else {
int fd = open_lockme();
sleep(2); puts("(2): trying to set shared lock");
flock(fd, LOCK_SH); puts("(2): shared lock set");
sleep(2);
close(fd); puts("(2): fd closed, shared lock removed");
}
}
else {
int fd = open_lockme();
sleep(1); puts("(3): trying to set exclusive lock");
flock(fd, LOCK_EX); puts("(3): exclusive lock set");
sleep(2);
close(fd); puts("(3): fd closed, exclusive lock removed");
}
return EXIT_SUCCESS;
}