编程接口指南

获取锁定信息

可以确定哪个进程在持有锁定。可以按照前面示例所示设置锁定,并在 fcntl(2) 中使用 F_GETLK

下一示例查找并列显文件中所有锁定段上的标识数据。


示例 5–2 列显文件的锁定段

struct flock lck;



 	lck.l_whence = 0;

 	lck.l_start = 0L;

 	lck.l_len = 0L;

 	do {

 		lck.l_type = F_WRLCK;

 		(void) fcntl(fd, F_GETLK, &lck);

 		if (lck.l_type != F_UNLCK) {

 			(void) printf("%d %d %c %8ld %8ld\n", lck.l_sysid, lck.l_pid,

            (lck.l_type == F_WRLCK) ? 'W' : 'R', lck.l_start, lck.l_len);

 			/* If this lock goes to the end of the address space, no

 			 * need to look further, so break out. */

 			if (lck.l_len == 0) {

 			/* else, look for new lock after the one just found. */

 					lck.l_start += lck.l_len;

 			}

 		}

 	} while (lck.l_type != F_UNLCK);

fcntl(2)F_GETLK 命令可以在等待服务器响应时处于休眠状态。如果客户机或服务器出现资源不足的情况,则此命令可能会失败,同时返回 ENOLCK

lockf(3C)F_TEST 命令一起使用来测试进程是否在持有锁定。此接口并不返回有关锁定的位置或拥有权的信息。


示例 5–3 使用 lockf 测试进程

(void) lseek(fd, 0, 0L);

 /* set the size of the test region to zero (0). to test until the

    end of the file address space. */

 if (lockf(fd, (off_t)0, SEEK_SET) < 0) {

 	switch (errno) {

 		case EACCES:

 		case EAGAIN:

 			(void) printf("file is locked by another process\n");

 			break;

 		case EBADF:

 			/* bad argument passed to lockf */

 			perror("lockf");

 			break;

 		default:

 			(void) printf("lockf: unexpected error <%d>\n", errno);

 			break;

 	}