Unix 스타일 부분 파일 잠금 메커니즘

Unix 스타일 부분 파일 잠금 메커니즘

Linux 및 AFAIK 대부분의 UNIX는 flock파일 잠금을 강제하는 시스템 호출을 노출합니다. 물론 내 경험은 제한되어 있지만 전체 리소스에 대해 커널에 의해 시행된다고 들었습니다. 그러나 특정 경계를 넘지 않거나 잠긴 영역의 외부 경계에 도달한 후 읽기를 중지하지 않는 한 해당 리소스에 대한 읽기/쓰기가 허용되도록 파일의 일부만 강제로 잠그고 싶다면 어떻게 해야 할까요? 가능합니까?

편집: 가능한 구현

요청된 영역이 잠금을 보유하지 않는 경우 메모리가 각 판독기의 주소 공간에 매핑되는 MMaped 영역을 통해 부분 잠금을 참조할 가능성이 달성될 수 있습니다. 이는 완전히 사용자 공간에서 구현되므로 커널 강제 잠금의 이점을 잃게 되지만 확실히 작동합니다.

답변1

다음을 사용하여 부분 잠금을 얻을 수 있습니다.fcntl(2)F_SETLK시스템 호출은 또는 명령 매크로 에 의해 이루어지며, F_SETLKW세 번째 인수로 제공되는 구조를 통해 F_GETLK잠길 부분 영역을 제공합니다 .flock

F_SETLK, F_SETLKWF_GETLK는 레코드 잠금(바이트 범위 잠금, 파일 세그먼트 잠금 또는 파일 영역 잠금이라고도 함)이 존재하는지 여부를 획득, 해제 및 테스트하는 데 사용됩니다. 세 번째 매개변수 잠금은 최소한 다음 필드(지정되지 않은 순서)가 있는 구조에 대한 포인터입니다.

struct flock {
    ...
    short l_type;    /* Type of lock: F_RDLCK,
                        F_WRLCK, F_UNLCK */
    short l_whence;  /* How to interpret l_start:
                        SEEK_SET, SEEK_CUR, SEEK_END */
    off_t l_start;   /* Starting offset for lock */
    off_t l_len;     /* Number of bytes to lock */
    pid_t l_pid;     /* PID of process blocking our lock
                        (set by F_GETLK and F_OFD_GETLK) */
    ...
};

이 구조의 l_whence, l_start및 필드는 l_len잠그려는 바이트 범위를 지정합니다. 파일 끝 뒤의 바이트는 잠길 수 있지만 파일 시작 앞의 바이트는 잠길 수 없습니다.

관련 정보