锁定记录时,请不要将锁定段的起始点和长度设置为零。否则,此锁定过程与文件锁定相同。
使用记录锁定的原因是存在数据争用。因此,当无法获取所有所需锁定时,应收到失败响应:
等待一定时间后,再次尝试
终止该过程,向用户发出警告
使进程进入休眠状态,直到向该进程发送已释放锁定的信号
执行上述操作的某些组合
本示例说明使用 fcntl(2) 锁定的记录。
{
struct flock lck;
...
lck.l_type = F_WRLCK; /* setting a write lock */
lck.l_whence = 0; /* offset l_start from beginning of file */
lck.l_start = here;
lck.l_len = sizeof(struct record);
/* lock "this" with write lock */
lck.l_start = this;
if (fcntl(fd, F_SETLKW, &lck) < 0) {
/* "this" lock failed. */
return (-1);
...
}
下一示例说明 lockf(3C) 接口。
#include <unistd.h>
{
...
/* lock "this" */
(void) lseek(fd, this, SEEK_SET);
if (lockf(fd, F_LOCK, sizeof(struct record)) < 0) {
/* Lock on "this" failed. Clear lock on "here". */
(void) lseek(fd, here, 0);
(void) lockf(fd, F_ULOCK, sizeof(struct record));
return (-1);
}
应使用与设置锁定相同的方法来删除锁定。只是锁定类型有所不同 (F_ULOCK)。解除锁定不受其他进程的阻止,并且只影响调用进程所设置的锁定。解除锁定只影响在先前锁定调用中指定的文件段。