C 언어에서 여러 프로세스가 같은 파일을 동시에 수정하지 않게 간단한 파일 잠금을 걸 때 flock()을 쓴다.
작게 실행해 보기
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <sys/uio.h>
int main(void) {
FILE *fp = tmpfile();
if (!fp)
return 1;
if (fputs("abcdef", fp) == EOF || fflush(fp) == EOF) {
fclose(fp);
return 1;
}
int fd = fileno(fp);
if (fd < 0) {
fclose(fp);
return 1;
}
if (flock(fd, LOCK_EX | LOCK_NB) < 0) {
fclose(fp);
return 1;
}
puts("locked");
if (flock(fd, LOCK_UN) < 0) {
fclose(fp);
return 1;
}
if (fclose(fp) == EOF)
return 1;
return 0;
}이 프로그램이 만든 임시 파일에만 배타 잠금을 건 뒤 해제한다. 다른 실제 파일을 잠그는 예제가 아니다.
반환값과 주의점
성공은 0, 실패는 -1이다. LOCK_NB를 더하면 잠길 때 기다리지 않고 EWOULDBLOCK으로 실패할 수 있다.
LOCK_SH는 공유 잠금, LOCK_EX는 배타 잠금이다. 협조하는 프로그램끼리 사용하는 잠금이므로 잠금을 무시하는 쓰기까지 막는 장치는 아니다.
예제 실행 방법
gcc -std=c11 -Wall -Wextra example.c -lm -o example
./example
답글 달기