Linux 및 AFAIK 대부분의 UNIX는 flock
파일 잠금을 강제하는 시스템 호출을 노출합니다. 물론 내 경험은 제한되어 있지만 전체 리소스에 대해 커널에 의해 시행된다고 들었습니다. 그러나 특정 경계를 넘지 않거나 잠긴 영역의 외부 경계에 도달한 후 읽기를 중지하지 않는 한 해당 리소스에 대한 읽기/쓰기가 허용되도록 파일의 일부만 강제로 잠그고 싶다면 어떻게 해야 할까요? 가능합니까?
편집: 가능한 구현
요청된 영역이 잠금을 보유하지 않는 경우 메모리가 각 판독기의 주소 공간에 매핑되는 MMaped 영역을 통해 부분 잠금을 참조할 가능성이 달성될 수 있습니다. 이는 완전히 사용자 공간에서 구현되므로 커널 강제 잠금의 이점을 잃게 되지만 확실히 작동합니다.
답변1
다음을 사용하여 부분 잠금을 얻을 수 있습니다.fcntl(2)
F_SETLK
시스템 호출은 또는 명령 매크로 에 의해 이루어지며, F_SETLKW
세 번째 인수로 제공되는 구조를 통해 F_GETLK
잠길 부분 영역을 제공합니다 .flock
F_SETLK
,F_SETLKW
및F_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
잠그려는 바이트 범위를 지정합니다. 파일 끝 뒤의 바이트는 잠길 수 있지만 파일 시작 앞의 바이트는 잠길 수 없습니다.