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

흠. 읽기, 쓰기 및 읽기/쓰기 (하나의 프로세스에만 해당)에 대한 독점 잠금이 필요합니다. 그리고 나는 어떤 자물쇠 타입이 나를 위해 더 좋을지 이해할 수 없었다. 하지만 읽기/쓰기 열기 (... O_RDWR) 파일 잠금 방법? 감사. – nms

+0

@nms 어떤 프로세스가 당신이 쓰고있는 데이터를 읽는 것이 꽤 쓸모 없으며 경쟁 조건을 초래합니다. 따라서 작성자를 차단하는 쓰기 잠금은 없습니다. 쓰기 잠금은 독자와 작성자를 잠급니다. – nos

+0

오케이. 읽기 잠금에 관해서. 나는 그것이 쓰기 및 다른 독자들조차해야한다고 생각한다. 위의 코드가 맞습니까? 감사. – nms