|
楼主
发表于: 2007-09-05 10:07
利用mktemp和fcntl实现进程间互斥操作
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); } } |
|---|



