struct flock lock_it, unlock_it;
int lock_fd = -1;
void my_lock_init(char *pathname)
{
char lock_file[64];
strncpy(lock_file, pathname, sizeof(lock_file));
lock_file[sizeof(lock_file) - 1] = '\0';
if (mktemp(lock_file) == NULL) {
perror("mktemp");
exit(-1);
}
if ((lock_fd = open(lock_file, O_CREAT | O_WRONLY, 0600)) < 0) {
perror("open lock file");
exit(-1);
}
unlink(lock_file); /* unlink 不影响文件打开状态,也省却了某些
* 好事者看见锁文件就妄图删除之为快 */
lock_it.l_type = F_WRLCK;
lock_it.l_whence = SEEK_SET;
lock_it.l_start = 0;
lock_it.l_len = 0;
unlock_it.l_type = F_UNLCK;
unlock_it.l_whence = SEEK_SET;
unlock_it.l_start = 0;
unlock_it.l_len = 0;
}
void my_lock( )
{
while (fcntl(lock_fd, F_SETLKW, &lock_it) < 0) {
if (errno == EINTR)
continue;
else {
perror("fcntl lock");
exit(-1);
}
}
}
void my_unlock( )
{
if (fcntl(lock_fd, F_SETLKW, &unlock_it) < 0) {
perror("fcntl lock");
exit(-1);
}
}