2013-03-19 20 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

嗯。我需要独占锁定读取,写入和读取/写入(仅限一个进程)。我无法理解哪种锁定类型对我来说会更好。但如何锁定文件的读/写打开(... O_RDWR)?谢谢。 – nms 2013-03-19 10:42:22

+0

@nms有一些进程读取你正在写入的数据是非常没用的,并导致竞态条件。所以没有写锁只能阻止作者。写锁将锁定读者和作者。 – nos 2013-03-19 11:14:22

+0

好的。至于读锁。我想它应该锁定写入甚至其他读者。那么我的代码是否正确?谢谢。 – nms 2013-03-19 11:41:30

相关问题