Как да заключите файл за достъп за четене и запис за 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
Хм. Имам нужда от изключително заключване за четене, запис и четене/запис (само за един процес). И не можах да разбера кой тип ключалка ще е по-добър за мен. Но как да заключите файл за четене/запис отворен (...O_RDWR )? Благодаря. - person nms; 19.03.2013
comment
@nms Да накарате някакъв процес да прочете данните, на които пишете, е доста безполезно и води до условия на състезание. Така че няма заключване на запис, което да блокира само писателите. Заключването на запис ще заключи читатели и писатели. - person nos; 19.03.2013
comment
Добре. Що се отнася до блокировката за четене. Предполагам, че трябва да заключва записите и дори други четци. Така че кодът ми по-горе правилен ли е? Благодаря. - person nms; 19.03.2013