본문 바로가기

진리는어디에

fcntl() 함수를 이용한 File locking

구버젼의 UNIX 시스템에서는 레코드 단위(혹은 byte range 단위)에 대한 loking을 지원 하지 않았다. 하지만 여러가지 상업적인 이유와 역사적인 이유로 인해서 각 UNIX 계열 시스템에서도 레코드 단위의 locking을 지원하기 시작 했다고 한다.

#include <fcntl.h>

int fcntl(int filedes, int cmd, .../* struct flock *flockptr */);

 record locking을 위해서 사용되는 cmd의 인자로는 F_GETLK, F_SETLK 또는 F_SETLKW가 올수 있다. 세번째 인자인 flockptr은 flock 구조체의 포인터다. 인자의 설명은 이름을 통해 직관적으로 알 수 있으니 건너 뛰기로 하고 F_GETLK에 대해서만 간단히 알아 보자.

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을 가지고 있는 프로세스의 아이디


참고적으로 read lock은 한개 이상의 read locking 요청을 받아 들일 수 있지만, write locking 한 개만 이상 받아 들이지 않는다.

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!