2014-02-20 3 views
5

파일이 잠겨 있는지 확인하려면 다음 코드를 사용합니다. 그렇지 않다면 나는 그것에 쓰고 싶다. 나는이 코드를 두 개의 터미널에서 동시에 실행함으로써이 코드를 실행하지만, 잠겨 있지는 않지만 항상 두 개의 탭에서 항상 "잠긴"상태가됩니다. 코드는 다음과 같습니다 :파일이 잠겨져 있는지 확인하는 방법은 무엇입니까?

#include <fcntl.h> 
#include <stdio.h> 
#include <unistd.h> 

int main() 
{ 
    struct flock fl,fl2; 
    int fd; 

    fl.l_type = F_WRLCK; /* read/write lock */ 
    fl.l_whence = SEEK_SET; /* beginning of file */ 
    fl.l_start = 0;  /* offset from l_whence */ 
    fl.l_len = 0;  /* length, 0 = to EOF */ 
    fl.l_pid = getpid(); /* PID */ 

    fd = open("locked_file", O_RDWR | O_EXCL | O_CREAT); 
    fcntl(fd, F_GETLK, &fl2); 
    if(fl2.l_type!=F_UNLCK) 
    { 
     printf("locked"); 
    } 
    else 
    { 
     fcntl(fd, F_SETLKW, &fl); /* set lock */ 
     write(fd,"hello",5); 
     usleep(10000000); 
    } 
    printf("\n release lock \n"); 

    fl.l_type = F_UNLCK; 
    fcntl(fd, F_SETLK, &fl); /* unset lock */ 
} 

답변

3

매우 간단하고, 단지 F_GETLK 대신 F_SETLK과 fnctl를 실행합니다. 그러면 포인터가 가리키는 데이터가 잠금의 현재 상태로 설정되고 l_type 속성에 액세스하면 잠금 상태인지 확인할 수 있습니다.

자세한 내용은 http://linux.die.net/man/2/fcntl을 참조하십시오.

+0

게시 된 코드에 'F_GETLK'이 (가) 이미 설정되어 있고 원래 게시물이 수정되지 않았습니다. 대답을 조금 설명해 주시겠습니까? 나는 왜이 대답이 받아 들여지는지 상상할 수 없다. 내가 눈치 채지 못한 게 있니? – Anubis

+0

@Anubis OP가 위의 링크에서 대답을 찾았 기 때문에 받아 들여 졌다고 생각합니다. 나는 OP의 코드에 잘못된 것으로 밝혀진 것을 설명하는 자신의 대답을 남겼습니다. – HSchmale

1

당신은 또한 당신이 실패 fcntl(fd, F_GETLK, &fl2)perror를 사용할 때 그렇지 않으면, 당신은 터미널과 같은 메시지가 표시됩니다 memset 0으로 fl2해야합니다

은 fcntl : 잘못된 아규먼트

시스템 호출을 디버깅 할 때 perror을 사용하는 것이 좋습니다.