2013-06-27 6 views
8

시나리오 : 그물을 통해 파일을 가져올 필요가있는 많은 프로세스가 실행 중입니다. 파일이 이미 다운로드 된 경우 디스크에 캐시됩니다. 다른 프로세스가 파일을 다운로드하는 경우 다운로드가 완료 될 때까지 차단하십시오.Linux에서 잠긴 파일을 자동 생성하려면 어떻게합니까?

저는이 작업을 수행하는 가장 쉬운 방법을 찾으려고 노력해 왔습니다. 내가 만드는 등,) (오픈을 사용하는 방법에 대한 문서를 찾을 수 없습니다,

create file w/ an exclusive lock active on it only if it doesn't exist (O_CREAT | O_EXCL) 
if file exists already: 
    open file and acquire exclusive lock 
else: 
    download to newly created file 
release lock 

이 시스템은

불행하게도 (겉으로는) 전혀 경쟁 조건으로 위의 목표를 달성 : 확실한 방법은에있다 Linux에서 잠긴 파일. 나는에 생성 단계를 분할하는 경우 :

open w/ O_CREAT | O_EXCL 
flock 

경쟁 조건이 지금 사이에 존재 만들고 잠금 (비 만드는 과정은 작성자 수행하기 전에 잠금을 획득).

파일 당 외부 잠금 파일 (예 : 파일 이름 + '.lock)을 사용할 수 있음을 알았지 만, 파일 이름을 만들려고 시도하기 전에 획득했지만,이 느낌은 참 으적합니다. 실제로는 .lock 접미사가 있습니다!)

(Windows가 제공하는 것처럼) 원자 적으로 생성하고 잠그는 방법이 있습니까? 또는 표준 lock/lockfile 방법이 거의 표준/필수 사항입니까?

답변

6

어쨌든 인종이 존재합니다. 파일이 존재하거나 존재하지 않을 경우, 파일을 잠그기 전에 존재 여부를 테스트해야합니다. 그러나 파일이 뮤텍스 인 경우 "파일이 이미있는 경우"(false)와 "새로 만든 파일에 다운로드"사이의 공백은 제한되지 않습니다. 다운로드가 시작되기 전에 다른 프로세스가 파일을 만들어서 다운로드를 시작할 수 있습니다.

기본적으로 fcntl 잠금을 사용하지 말고 파일 자체의 존재를 사용하십시오. open() (O_CREAT 및 O_EXCL)은 파일이 이미 있으면 실패하여 다른 사람이 먼저 도착했음을 알립니다.

+0

나는 원자 파일이 존재하지 않는 경우에만 잠긴 파일을 만들 수 있다면 경쟁이 존재 얼마나 확실하지 않다. (조건도 원자 적입니다). O_CREAT | O_EXCL은 파일이 존재하지 않으면 원자 만들기입니다. 그냥 자물쇠로하고 싶다. 파일이 존재할 때 다른 프로세스가 다운로드를 시작할 수 없습니다. 마지막으로 다운로드가 완료 될 때까지 차단해야하므로 단독으로 사용할 수 없습니다. 내 솔루션에서는 독점 읽기/쓰기 잠금을 사용합니다. – UsAaR33

+2

파일을 원자 적으로 만들고 잠금을 설정하면 문제가 해결됩니다. 그러나 그것은 fcntl 잠금 장치가 작동하는 방식이 아닙니다. 미안합니다. fcntl 잠금을 사용하려면 프로그램에서 동기화 작업을 수행하기 전에 잠금중인 파일이 있어야합니다.의사 코드에서 if() 외부에서 생성을 이동하는 방법을 찾거나 다운로드 파일을 뮤텍스로 사용하지 않는 다른 동기화 프로토콜을 작성하십시오. –

+0

그래서 대답은 리눅스가 윈도우 스타일의 원자 잠금 장치를 제공하지 않는다는 것입니다. lockfile 메서드를 사용하겠습니다. – UsAaR33

0

왜 잠금 파일 유틸리티를 사용하지 않습니까?

는 "중요한"파일에 대한 액세스 즉, 더 이상 프로그램이나 쉘 스크립트 가 액세스 할 수 없습니다해야 직렬화 ,이 있는지 확인하려면 가정하자. 간단히하기 위해 쉘 스크립트가 이라고 가정 해 봅시다. 이 경우는 다음과 같이 그것을 해결할 수 :

... 
lockfile important.lock 
... 
access_"important"_to_your_hearts_content 
... 
rm -f important.lock 
...