【发布时间】:2013-08-10 08:04:55
【问题描述】:
我编译这个文件并在一个控制台中运行它。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
/* l_type l_whence l_start l_len l_pid */
struct flock fl = {F_WRLCK, SEEK_SET, 0, 0, 0 };
int fd;
fl.l_pid = getpid();
if (argc > 1)
fl.l_type = F_RDLCK;
if ((fd = open("lockdemo.c", O_RDWR)) == -1) {
perror("open");
exit(1);
}
printf("Press <RETURN> to try to get lock: ");
getchar();
printf("Trying to get lock...");
if (fcntl(fd, F_SETLKW, &fl) == -1) {
perror("fcntl");
exit(1);
}
printf("got lock\n");
printf("Press <RETURN> to release lock: ");
getchar();
fl.l_type = F_UNLCK; /* set to unlock same region */
if (fcntl(fd, F_SETLK, &fl) == -1) {
perror("fcntl");
exit(1);
}
printf("Unlocked.\n");
close(fd);
return 0;
}
它输出:
ZJ:~/Documents/c$ ./a.out
press <RETURN> to try to get lock:
Trying to get lock...got lock
press <RETURN> to release lock:
我打开另一个控制台并 vi lockdemo.c 并成功修改了 lockdemo.c。为什么?这个文件不是被锁了吗? 当我打开另一个控制台时
ZJ:~/Documents/c$ ./a.out
press <RETURN> to try to get lock:
a.out 一直在运行 getchar(),甚至无法执行 printf("正在尝试获取锁..."); 我完全糊涂了。
【问题讨论】:
-
在某些系统上提供了三种不同的锁定机制,其中两种由 POSIX 指定。有fcntl和lockf,虽然后者还是比较新的,至少在Linux的情况下,还有flock函数。当然,所有这些都是建议性的。锁定文件实际上并不意味着它看起来。如果另一个进程使用另一个锁定功能,则无法保证您的进程一定可以安全地读取/写入文件。在强制锁的情况下,它们在 Linux 上仍然不可靠(参见BUGS)