锁定文件。先做什么?解锁还是关闭?

时间:2013-03-19 00:05:10

标签: c linux locking cgi-bin

我解锁然后关闭。 一个过程附加记录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);
}

我试着关闭(fd)UnLock(fd)。 它似乎有效。 但无论如何,开放和锁定之间存在延迟。 感谢。

1 个答案:

答案 0 :(得分:3)

只要你没有write(2)一个文件(解锁后),如果你先解锁它或先close(2)它就没关系。

但是,close(2) - 一个文件会解锁它(至少如果没有其他进程共享同一个打开的文件描述符)。

请参阅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.

附录:应检查失败

请注意,您的代码缺少错误检查。几乎每个库函数或系统调用(尤其是fcntlreadwrite都可能失败(并设置errno以显示例如perror或{{ 1}}在某些日志或打印中)。您不会检查strerror(errno)fcntl函数中LockFile的成功与否,也不会在调用方中检查。