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