여러 개의 프로세스들을 동시에 실행하는 컴퓨터에서는 파일 같은 공유 자원에 대한 접근 중재와 동기화가 중요한 문제가 된다.
Windows 는 파일 전체 또는 일부를 잠글 수 있다. 일단 파일 또는 파일의 일부분을 잠그면 다른 프로세스 또는 같은 프로세스의 다른 스레드는 그 파일 또는 파일의 일부분에 접근 할 수 없다. 잠금은 프로세스 수준에서 강제되는 것이기 때문에 어떠한 프로세스가 기존의 잠금을 위반하면서 파일의 일부에 대해 접근하려 하면 그 접근은 실패한다.
파일 잠금에서 가장 일반적인 함수는 LockFileEx이다. 확장 I/O 함수군에 속하는 것으로 잠글 64비트 파일 위치와 파일 영역의 범위를 지정하기 위해 중첩 구조체가 필요하다.
LockFileEx 함수의 원형은 다음과 같다.
BOOL LockFileEx(
HANDLE hFile, // 열린 파일 핸들
DWORD dwFlags, // 잠금 모드와 자물쇠가 풀릴 때까지 기다릴지의 여부를 결정
// LOCKFILE_EXCLUSIVE_LOCK => 읽기/ 쓰기 자물쇠가 된다.
// LOCKFILE_FAIL_IMMEDIATELY => 자물쇠를 얻을 수 없는 경우 즉시 FALSE를 반환한다.
DWORD dwReserved, // 반드시 0으로 설정
DWORD nNumberOfBytesToLockLow, // 잠글 바이트 구간의 길이
DWORD nNumberOfBytesToLockHigh, // 잠글 바이트 구간의 길이
LPOVERLAPPED lpOverlapped);
UnlockFileEx 함수의 원형은 다음과 같다. dwFlags를 제외한 매개변수는 LockFileEx와 동일하다.
BOOL UnlockFileEx(
HANDLE hFile, // 열린 파일 핸들
DWORD dwReserved, // 반드시 0으로 설정
DWORD nNumberOfBytesToLockLow, // 잠글 바이트 구간의 길이
DWORD nNumberOfBytesToLockHigh, // 잠글 바이트 구간의 길이
LPOVERLAPPED lpOverlapped);
파일 잠금을 사용할 때 주의사항이 몇가지 있다.
1) 자물쇠를 해제할 때에는 파일을 잠갔을 때와 정확히 동일한 구간을 지정해야 한다. 이전의 두 잠금 구간들을 결합해서 한번에 해제한다거나 잠긴 구간의 일부만을 해제하는 것은 불가능 하다.
2) 새 자물쇠가 기존의 잠긴 영역과 겹쳐서 충돌이 생기면 잠금이 실패한다.
3) 파일의 끝을 넘는 영역을 잠그는 것이 가능하다.
4) 자물쇠들이 새로 생성된 프로세스로 상속되지 않는다.
출처 : Windows 시스템 프로그래밍 윈도우즈 API 핵심 바이블
'0x001 Programming > 01. C | C++' 카테고리의 다른 글
[Example] 예외 처리 (0) | 2017.12.29 |
---|---|
[Tip] 예외 처리 (0) | 2017.12.29 |
[Example] 디렉터리 내용 출력 (0) | 2017.12.29 |
[Tip] 문자열 처리 관련 (0) | 2017.12.29 |
[Example] 파일 복사 (0) | 2017.12.29 |