编程接口指南

设置和删除记录锁定

锁定记录时,请不要将锁定段的起始点和长度设置为零。否则,此锁定过程与文件锁定相同。

使用记录锁定的原因是存在数据争用。因此,当无法获取所有所需锁定时,应收到失败响应:

本示例说明使用 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)。解除锁定不受其他进程的阻止,并且只影响调用进程所设置的锁定。解除锁定只影响在先前锁定调用中指定的文件段。