구버젼의 UNIX 시스템에서는 레코드 단위(혹은 byte range 단위)에 대한 loking을 지원 하지 않았다. 하지만 여러가지 상업적인 이유와 역사적인 이유로 인해서 각 UNIX 계열 시스템에서도 레코드 단위의 locking을 지원하기 시작 했다고 한다.
record locking을 위해서 사용되는 cmd의 인자로는 F_GETLK, F_SETLK 또는 F_SETLKW가 올수 있다. 세번째 인자인 flockptr은 flock 구조체의 포인터다. 인자의 설명은 이름을 통해 직관적으로 알 수 있으니 건너 뛰기로 하고 F_GETLK에 대해서만 간단히 알아 보자.
F_GETLK : 다른 lock이 걸려 있는지 알아 보는 플래그
참고적으로 read lock은 한개 이상의 read locking 요청을 받아 들일 수 있지만, write locking 한 개만 이상 받아 들이지 않는다.
#include <fcntl.h>
int fcntl(int filedes, int cmd, .../* struct flock *flockptr */);
F_GETLK : 다른 lock이 걸려 있는지 알아 보는 플래그
struct flock {
short l_type; /* F_RDLCK, F_WRLCK, or F_UNLCK */
off_t l_start; /* offset in bytes, relative to l_whence */
short l_whence; /* SEEK_SET, SEEK_CUR, or SEEK_END */
off_t l_len; /* length, in bytes; 0 means lock to EOF */
pid_t l_pid; /* returned with F_GETLK */
};
l_type : F_RDLCK(shared read lock), F_WRLCK(exclusive write lock), F_UNLCK(unlock)
l_start : lock 또는 unlock 될 영역의 시작 오프셋
l_whence : SEEK_SET, SEEK_CUR, SEEK_END
l_len : l_start부터 lock을 걸 바이트, 0은 EOF까지를 의미한다.
l_pid : F_GETLK일때만 리턴, lock을 가지고 있는 프로세스의 아이디
short l_type; /* F_RDLCK, F_WRLCK, or F_UNLCK */
off_t l_start; /* offset in bytes, relative to l_whence */
short l_whence; /* SEEK_SET, SEEK_CUR, or SEEK_END */
off_t l_len; /* length, in bytes; 0 means lock to EOF */
pid_t l_pid; /* returned with F_GETLK */
};
l_type : F_RDLCK(shared read lock), F_WRLCK(exclusive write lock), F_UNLCK(unlock)
l_start : lock 또는 unlock 될 영역의 시작 오프셋
l_whence : SEEK_SET, SEEK_CUR, SEEK_END
l_len : l_start부터 lock을 걸 바이트, 0은 EOF까지를 의미한다.
l_pid : F_GETLK일때만 리턴, lock을 가지고 있는 프로세스의 아이디
참고적으로 read lock은 한개 이상의 read locking 요청을 받아 들일 수 있지만, write locking 한 개만 이상 받아 들이지 않는다.