Я не могу найти ответ о том, как заблокировать файл для чтения-записи.Как заблокировать файл для доступа для чтения и записи для O_RDWR
lock.l_type = F_WRLCK //for write.
lock.l_type = F_RDLCK //for read
lock.l_type = F_RDLCK|F_WRLCK //maybe for read/write????
Правильный ли он?
fd=MyOpenWrite(name,O_RDWR); //for read/write
//(open file for read/write, but lock for write)
...
fd=MyOpenRead(name,O_RDONLY); //open and lock for read
...
fd=MyOpenWrite(name,O_CREAT|O_WRONLY|O_TRUNC); //for write
...
fd=MyOpenWrite(name,O_WRONLY|O_APPEND); //for append
int MyOpenRead(char *name,int flags) {
int fd;
struct flock lock;
fd = open(name,flags);
if (fd<0) return -1;
lock.l_type = F_RDLCK;
lock.l_start = 0;
lock.l_whence = SEEK_SET;
lock.l_len = 0;
fcntl(fd,F_SETLKW,&lock);
return fd;
}
int MyOpenWrite(char *name,int flags) {
int fd;
struct stat st;
fd = open(name,flags,S_IREAD|S_IWRITE|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
if (fd<0) return -1;
lock.l_type = F_WRLCK;
lock.l_start = 0;
lock.l_whence = SEEK_SET;
lock.l_len = 0;
fcntl(fd,F_SETLKW,&lock);
return fd;
}
Хмм. Мне нужна эксклюзивная блокировка для чтения, записи и чтения/записи (только для одного процесса). И я не мог понять, какой тип блокировки будет лучше для меня. Но как заблокировать файл для чтения/записи open (... O_RDWR)? Благодарю. – nms
@nms Имея некоторый процесс чтения данных, которые вы пишете, это бесполезно и приводит к условиям гонки. Таким образом, нет блокировки записи, которая блокирует только записи. Блокировка записи блокирует читателей и писателей. – nos
Хорошо. Что касается блокировки чтения. Думаю, он должен блокировать записи и даже других читателей. Правильно ли мой код? Благодарю. – nms