1

ロックを解除してから閉じます。1 つのプロセスがレコード ABCDEFGHIJ を追加します。別のプロセスが同じファイルを読み取り、ZZZZ を書き込みます。通常のファイルは ZZZZ ABCDEFGHIJ である必要があります

しかし、私は一度だけ次を見ました: ZZZZEFGHIJ したがって、レコード ABCDEFGHIJ は ZZZZ で破損しています。

私のロックが機能していないようです。しかし、私はそれをテストしました。あるプロセスが実際に別のプロセスを待っています。open と lock の間で、別のプロセスがファイルに書き込むことはできますか? それともロック解除とクローズの間?

コードは以下です

int MyOpenWrite(char *name,int flags) {
int fd
fd = open(name,flags,S_IREAD|S_IWRITE|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
LockFile(fd);
return fd;
 }

int WriteFile(char *name, char *data) {
...
fd = MyOpenWrite(fullName,O_CREAT|O_WRONLY|O_TRUNC);
write(fd,data,strlen(data));
UnLockFile(fd);
close(fd);
}

int ReadFile(char *name, char *data, int maxLength) {
fd = open(name,O_RDONLY);
LockFile(fd);
...
UnLockFile(fd);
close(fd);
}

int AppendFile(char *name, char *data) {
fd = MyOpenWrite(fullName,O_WRONLY|O_APPEND);
...
len=write(fd,data,strlen(data));
UnLockFile(fd);
close(fd);
 }

int LockFile(int fd) {
struct flock    lock;
lock.l_type = F_WRLCK;
lock.l_start = 0;
lock.l_whence = SEEK_SET;
lock.l_len = 0;
return fcntl(fd,F_SETLKW,&lock);
}

int UnLockFile(int fd)  {
struct flock    lock;
lock.l_type = F_UNLCK;
lock.l_start = 0;
lock.l_whence = SEEK_SET;
lock.l_len = 0;
return fcntl(fd,F_SETLKW,&lock);
}

UnLock(fd) を close(fd) しようとしました。それはうまくいくようです。とにかく、開いてからロックするまでに遅延があります。ありがとう。

4

1 に答える 1

3

(ロック解除後に) ファイルにアクセスしない限り、write(2)最初にロック解除するか最初にロック解除するかは問題ではありませんclose(2)

ただし、close(2)ファイルを -ing するとロックが解除されます (少なくとも、開いている同じファイル記述子を共有するプロセスが他にない場合)。

fcntl(2)を参照してください。

As well as being removed by an explicit F_UNLCK, record locks are
automatically released when the process terminates or if it closes any
file descriptor referring to a file on which locks are held.

補遺: 失敗をチェックする必要があります

コードにエラー チェックがないことに注意してください。ほとんどすべてのライブラリ関数または syscall、特にfcntlreadwriteが失敗する可能性があります (たとえば、ログや印刷に表示されるように設定されます) errno。または関数での成功または失敗をチェックせず、呼び出し元でもチェックしません。perrorstrerror(errno)fcntlLockFileUnlockFile

于 2013-03-19T01:43:11.710 に答える