Record Locking
- 동일한 파일에 동시에 접근하지 못하게 하기 위한 방법
- fcntl 을 통해 locking 함
- 권장될 뿐 필수는 아니다. locking 걸더라도 접근하는 process도 접근 전 locking을 먼저 확인해야 한다.
int fcntl(int filedes, int cmd, struct flock *ldata);
- cmd
- F_GETLK: lock 상태 리턴
- F_SETLK: waiting 없이 lock 설정. lock 할 수 없는 경우 바로 리턴. set할 수 없는 경우 EACCES 또는 EAGAIN 과 함께 -1 리턴
- F_SETLKW: lock을 할 수 있을 때까지 기다림(blocking 버전).
- ldata: lock 상태, offset, 파일 위치,길이,lock을 소유한 pid를 저장하고 있는 구조체
- l_whence를 기준으로 l_start만큼 떨어진 곳에서 l_len만큼 lock을 건다.

ex)
#include <unistd.h>
#include <fcntl.h>
...
struct flock my_lock;
my_lock.l_type = F_WRLCK;
my_lock.l_whence = SEEK_CUR;
my_lock.l_start = 0;
my_lock.l_len = 512;
fcntl(fd, F_SETLKW, &my_lock);

- lock은 파일 크기를 넘어서도 설정 가능하다.
F_WRLCK은 F_RDLCK와 F_WRLCK가 모두 unlock 상태인 경우에만 가능하다.
F_RDLCK는 F_WRLCK만 미리 걸려 있지 않으면 lock 가능하다.
Quiz: fcntl

- 정답: lock4
- p, r 부분이 겹쳐서 lock이 불가능하여 -1 리턴
- lock1, lock3
- F_WRLCK 이 걸려 있는 부분이 없어서 F_RDLCK 걸려있는 부분이 겹쳐도 상관 없다.