相关分析: http://blog.chinaunix.net/uid-20775448-id-4009263.html
Linux提供两种文件锁的系统调用接口: fcntl 和 flock; 库函数lockf实际上是对fcntl的封装。
另外fcntl 的强制锁有BUG。
#include <stdio.h> #include <string.h> #include <unistd.h> #include <fcntl.h> int main(int argc, char * argv[]) { pid_t pid; int ret; struct flock lock; int fd; pid = getpid(); fd = open("temp.txt", O_CREAT | O_RDWR, 0644); if( fd < 0 ){ perror("open file failed\n"); return -1; } lock.l_len = 0; lock.l_start = 0; lock.l_type = F_WRLCK; lock.l_whence = SEEK_SET; printf("%d try to lock file\n", pid); ret = fcntl(fd, F_SETLKW, &lock); if(ret<0){ perror("lock failed\n"); return -1; } printf("%d locking file\n", pid); sleep(5); lock.l_type = F_ULOCK; ret = fcntl(fd, F_SETLK, &lock); if(ret<0){ perror("unlock failed\n"); return -1; } printf("%d unlock file\n", pid); return 0; }
编译后同时运行两个实例测试,如:
./a.out &; ./a.out
flock示例
#include <stdio.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <sys/file.h> int main(int argc, char * argv[]) { pid_t pid; int ret; int fd; pid = getpid(); fd = open("temp.txt", O_CREAT | O_RDWR, 0644); if( fd < 0 ){ perror("open file failed\n"); return -1; } printf("%d try to lock file\n", pid); ret = flock(fd, LOCK_EX); if(ret<0){ perror("lock failed\n"); return -1; } printf("%d locking file\n", pid); sleep(5); ret = flock(fd, LOCK_EX); if(ret<0){ perror("unlock failed\n"); return -1; } printf("%d unlock file\n", pid); return 0; }