2017-03-19 16 views
1

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; 
} 
+1

당신이 말하는 "잠금 장치"는 C의 일부가 아니며 [POSIX 표준] (https://en.wikipedia.org/wiki/POSIX)에 정의되어 있습니다. –

답변

0

당신은 F_GETLK 쿼리를 오해하고 있습니다. 이 호출 된 프로세스가 주어진 위치에 주어진 유형의 잠금을 설정하는 것을 차단하지 않으면 F_UNLCK을 반환합니다.

호출 프로세스는 이러한 기존 잠금을 ​​작성한 프로세스이기 때문에이 새 잠금을 작성할 수도 있습니다.


Mac OS X manuals

F_GETLK 

잠금 설명이 구조체의 무리에 대한 포인터로 촬영 한 세 번째 인수, 인수, 가 가리키는 블록하는 최초의 잠금을 얻으라고 (위 참조) . 검색된 정보는 flock 구조의 fcntl에 전달 된 정보를 덮어 씁니다. 이 잠금을 만들지 못하게하는 잠금이 없으면 F_UNLCK으로 설정된 잠금 유형의 경우 을 제외한이 함수 호출에 의해 구조가 변경되지 않습니다.