Related analysis: http://blog.chinaunix.net/uid-20775448-id-4009263.html
Linux provides two system call interfaces for file locks: fcntl and flock; the library function lockf is actually an encapsulation of fcntl.
In addition, there is a bug in the mandatory lock of fcntl.
#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; }
After compiling, run two instance tests at the same time, such as:
./a.out &; ./a.out
flock example
#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; }