Как заблокировать файл для чтения и записи для 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;
}

person nms    schedule 19.03.2013    source источник


Ответы (1)


Блокировка записи также блокирует считыватели. Это эксклюзивная блокировка, поэтому только * владелец может получить доступ к заблокированным байтам, и никто другой не может получить доступ к этим байтам, будь то чтение или запись.

* Блокировки fcntl() являются рекомендательными блокировками. Таким образом, любой, кто открывает файл, может свободно читать/писать в него, если он не сотрудничает, а также использует fcntl() для захвата блокировок. См. здесь, если вам нужна принудительная блокировка.

person nos    schedule 19.03.2013
comment
Хм. Мне нужна эксклюзивная блокировка для чтения, записи и чтения/записи (только для одного процесса). И я не мог понять, какой тип замка будет лучше для меня. Но как заблокировать файл для чтения/записи open(...O_RDWR )? Спасибо. - person nms; 19.03.2013
comment
@nms Когда какой-либо процесс считывает данные, в которые вы пишете, довольно бесполезно и приводит к условиям гонки. Таким образом, нет блокировки записи, которая блокирует только писателей. Блокировка записи блокирует считывателей и писателей. - person nos; 19.03.2013
comment
Хорошо. Что касается блокировки чтения. Я думаю, это должно блокировать запись и даже других читателей. Итак, мой код выше правильный? Спасибо. - person nms; 19.03.2013