시나리오 : 그물을 통해 파일을 가져올 필요가있는 많은 프로세스가 실행 중입니다. 파일이 이미 다운로드 된 경우 디스크에 캐시됩니다. 다른 프로세스가 파일을 다운로드하는 경우 다운로드가 완료 될 때까지 차단하십시오.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 방법이 거의 표준/필수 사항입니까?
나는 원자 파일이 존재하지 않는 경우에만 잠긴 파일을 만들 수 있다면 경쟁이 존재 얼마나 확실하지 않다. (조건도 원자 적입니다). O_CREAT | O_EXCL은 파일이 존재하지 않으면 원자 만들기입니다. 그냥 자물쇠로하고 싶다. 파일이 존재할 때 다른 프로세스가 다운로드를 시작할 수 없습니다. 마지막으로 다운로드가 완료 될 때까지 차단해야하므로 단독으로 사용할 수 없습니다. 내 솔루션에서는 독점 읽기/쓰기 잠금을 사용합니다. – UsAaR33
파일을 원자 적으로 만들고 잠금을 설정하면 문제가 해결됩니다. 그러나 그것은 fcntl 잠금 장치가 작동하는 방식이 아닙니다. 미안합니다. fcntl 잠금을 사용하려면 프로그램에서 동기화 작업을 수행하기 전에 잠금중인 파일이 있어야합니다.의사 코드에서 if() 외부에서 생성을 이동하는 방법을 찾거나 다운로드 파일을 뮤텍스로 사용하지 않는 다른 동기화 프로토콜을 작성하십시오. –
그래서 대답은 리눅스가 윈도우 스타일의 원자 잠금 장치를 제공하지 않는다는 것입니다. lockfile 메서드를 사용하겠습니다. – UsAaR33