2013-03-19 2 views
1

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

ответ

2

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

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

+0

Хмм. Мне нужна эксклюзивная блокировка для чтения, записи и чтения/записи (только для одного процесса). И я не мог понять, какой тип блокировки будет лучше для меня. Но как заблокировать файл для чтения/записи open (... O_RDWR)? Благодарю. – nms

+0

@nms Имея некоторый процесс чтения данных, которые вы пишете, это бесполезно и приводит к условиям гонки. Таким образом, нет блокировки записи, которая блокирует только записи. Блокировка записи блокирует читателей и писателей. – nos

+0

Хорошо. Что касается блокировки чтения. Думаю, он должен блокировать записи и даже других читателей. Правильно ли мой код? Благодарю. – nms

Смежные вопросы