, 당신이 관심있는 파일을 잠글 각 하나에 flock() 기능을 사용합니다.
외부 프로세스에 대한 걱정이 있다면 어떤 당신은 아마 제어 할 수 없어, 당신은 sysopen() 기능을 사용할 수 있습니다. (내가보기 엔 그건 그렇고, 추천)을 프로그래밍 펄 책에 따르면 :
덮어 쓰기의이 문제를 해결하려면, 당신은 이 작성 여부를 통해 개별 컨트롤을 제공하는 sysopen
를 사용해야합니다 새 파일 또는 기존 파일을 덮어 씁니다. 그리고 우리는 –e
파일 존재 테스트 을 여기에서 유용 할 목적으로 제공하지 않으며 단지 을 경합 조건으로 만 증가시키기 때문에 우리는 도랑을 파냅니다.
그들은 또한이 코드 샘플 블록 제공가 처음 몇 상수 당겨,이 예에서는
use Fcntl qw/O_WRONLY O_CREAT O_EXCL/;
open(FH, "<", $file)
|| sysopen(FH, $file, O_WRONLY | O_CREAT | O_EXCL)
|| die "can't create new file $file: $!";
을합니다 (sysopen
통화에 사용되는). 그런 다음 파일을 열려고 시도하면 open
이 표시되고 실패하면 sysopen
이 표시됩니다. 그들은 말을 계속 :
이제 파일이 어떻게 든 열려 이 실패하고 sysopen
시도 쓰기에 대한 새 파일을 열 때 플래그를 제공과 함께 있기 때문에, 전혀 해를 끼치 지 가 완료되지 않은 경우 사이에 존재로 온천 경우에도, sysopen
은 이미 존재하는 파일 을 열지 않습니다.
따라서, 상황에 맞는 일을 명확하게하기 위해 완전히 (더 이상 단계 1) 파일 테스트를 제거하고, 만 위의 블록과 유사한 코드를 사용하여 열기 작업을한다. 문제 해결됨!
이 여전히 해결되지 않는 * 이론적으로 누군가가 스테이지 1과 스테이지 2 * 문제 사이에이 파일을 만들 수 있습니다! 그것은 단지 파일을 여는 비 충돌 방식입니다. – creaktive
물론 있습니다. 우리는 OP 질문에서 "1 단계"를 완전히 없앴습니다. 이제 단 하나의 스테이지 만 있습니다 : 파일 열기! –
의견에 동의하지 않아서 ... 'open (FH, "<", $ file) || (! 1 자) || sysopen (...)'? 여전히 두 단계가 있습니다. 여러분은 그것들을 같은 문장에 넣기 만하면됩니다.내가 틀렸다면 나를 바로 잡아주세요. – creaktive