相关分析: 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;
}