C에서 POSIX 파일 영역 잠금을 이해하려고합니다. 아래 프로그램은 정말 간단하고 잠금을 F_WRLCK로 설정 한 다음 잠금을받습니다. 열림/설정 잠금 중에 오류가 없습니다. 불행히도 항상 F_UNLCK를 반환합니다. 실수는 어디 있습니까? OSX에서 제대로 작동하지 않을 수도 있습니까?fcntl F_GETLK는 항상 F_UNLCK를 반환합니다.
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
void printLockType(int lock) {
if (lock == F_RDLCK) {
printf("readlock %i \n", lock);
}else if (lock == F_WRLCK) {
printf("writelock %i \n", lock);
}else if (lock == F_UNLCK) {
printf("unlock %i \n", lock);
} else {
printf("other %i\n", lock);
}
}
int main(int argc, char *argv[])
{
int fd;
struct flock fl ,fl2;
fl2.l_type = F_RDLCK; /* read/write lock */
fl2.l_whence = 0; /* beginning of file */
fl2.l_start = 0; /* offset from l_whence */
fl2.l_len = 100; /* length, 0 = to EOF */
fl2.l_pid = getpid();
fl.l_type = F_WRLCK; /* read/write lock */
fl.l_whence = 0; /* beginning of file */
fl.l_start = 0; /* offset from l_whence */
fl.l_len = 1000; /* length, 0 = to EOF */
fl.l_pid = getpid();
if ((fd = open("xxx", O_RDWR)) == -1) {
perror("open");
exit(1);
}
if (fcntl(fd, F_SETLK, &fl) == -1) {
perror("fcntl");
exit(1);
}
if(fcntl(fd, F_GETLK, &fl2) == -1) {
printf("%s \n", strerror(errno));
} else {
printLockType(fl2.l_type);
}
return 0;
}
당신이 말하는 "잠금 장치"는 C의 일부가 아니며 [POSIX 표준] (https://en.wikipedia.org/wiki/POSIX)에 정의되어 있습니다. –