FLOCK(2)

명칭
flock - 열린 파일상의 문의형 락을 적용 또는 제거한다

프로그램 라이브러리
libc

서식
<sys/file.h> #define LOCK_SH 0x01 /* 공유 파일 락 */ #define LOCK_EX 0x02 /* 배타적 파일 락 */ #define LOCK_NB 0x04 /* 잠글 때 블록 하지 않는다 */ #define LOCK_UN 0x08 /* 파일을 언로크 한다 */ int flock(int fd, int operation)

해설
flock() (은)는, 파일 기술자 fd 에 대응하는 파일상의 문의형 락을 적용 또는 제거합니다. 락을 적용하려면 , 파라미터의 operation 에 LOCK_SH 또는 LOCK_EX 의 어느쪽이든과 필요하면 LOCK_NB (을)를 더해 지정합니다. 기존의 락을 언로크 하는 경우는 operation (을)를 LOCK_UN (으)로 해 주세요.

문의형 락은, 협동하는 프로세스간에서의 일관한 파일 조작을 가능하게 합니다만, 파일의 일관성을 프로텍션한다 물건이 아닙니다 (즉, 프로세스는 문의형 락을 사용하지 않고 파일에 액세스 할 수 있으므로, 그 결과 일관성이 없어질 가능성이 있습니다).

락 메카니즘은 공유 락과 배타적 락이라고 하는 2 개의 타입의 락을 제공합니다. 언제라도 복수의 공유 락을 1 개의 파일에 적용할 수 있습니다. 그러나, 동시에 1 개의 파일에 복수의 배타적 락, 또는 공유 락과 배타적 락의 양쪽 모두를 적용할 수 없습니다.

적절한 락의 타입을 지정하는 것만으로, 공유 락은 배타적 락에 업그레이드 할 수 있어 배타적 락을 공유 락에 다운 그레이드 할 수 있습니다. 그 결과적으로 전의 락은 해방되어 새로운 락이 적용됩니다 (다른 프로세스가 락을 취득해 해방한 후일지도 모릅니다).

이미 락 되고 있는 오브젝트에 대해 락을 요구하면(자), 락을 획득할 수 있을 때까지 호출측은 블록 됩니다. 다만 LOCK_NB 하지만 operation 에 포함되는 경우는 블록 되지 않습니다. 대신에 호출이 실패해, 에러 EWOULDBLOCK 하지만 돌려주어집니다.

주
락은 파일에 걸칠 수 있는 것이며, 파일 기술자가 걸칠 수 있는 것이 아닙니다. 즉, dup(2) 또는 fork(2) 에 의해 복제된 파일 기술자는, 락의 복수의 인스턴스는 되지 않고 , 1 개의 락에의 복수의 참조가 됩니다. 어느 파일에 대한 락을 보관 유지하고 있는 프로세스가 포크 해, child process가 명시적으로 그 파일을 언로크 하는 경우, parent process는 그 락을 잃습니다.

락을 기다려 블록 하고 있는 프로세스는 시그널로 일으켜질지도 모릅니다.

반환값

에러
flock() 호출은 다음의 경우에 실패합니다:

[EWOULDBLOCK]
    파일은 벌써 LOCK_NB 옵션이 지정된 상태로 락 되고 있습니다.

[EBADF]
    인수 fd 하지만 무효인 기술자를 가리키고 있습니다.

[EINVAL]
    인수 fd 하지만 파일 이외의 오브젝트를 참조하고 있습니다.

[EOPNOTSUPP]
    인수 fd 하지만 파일의 락을 서포트하지 않는 오브젝트를 참조하고 있습니다.

관련 항목
close(2), dup(2), execve(2), fork(2), open(2)

역사
flock() 함수는 4.2BSD 그리고 등장했습니다.