1

読み取り/書き込みのためにファイルをロックする方法についての答えが見つかりません。

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;
}
4

1 に答える 1

3

書き込みロックもリーダーをブロックします。これは排他的ロックであるため、所有者のみがロックされたバイトにアクセスでき、読み取りまたは書き込みを問わず、他の誰もそれらのバイトにアクセスできません。

* fcntl()ロックはアドバイザリロックです。したがって、ファイルを開く他のユーザーは、協力しない場合はファイルの読み取り/書き込みを自由に行うことができ、fcntl()を使用してロックを取得することもできます。必須のロックが必要な場合は、こちらをご覧ください

于 2013-03-19T09:47:24.610 に答える