는 내가 달성하고자하는 것은 이것이다 : 다른 프로세스가 잠금을 보유하는 경우, 그렇지 않으면 내가 수정하려고 루비 코드는 Ruby : 쓰기 위해 파일 잠금을 얻는 방법은 무엇입니까?
을 작성하기위한 잠금을 획득
- .
File.open(filename, "wb") { |inf| if inf.flock(File::LOCK_EX|File::LOCK_NB) == 0 ... end }
코드는 일반적으로
"rb"
입니다."wb"
으로 변경하면 문제가 발생합니다. 잠금을 시도 할 때까지는 알 수없는 다른 프로세스가 파일에서 작업 중이면File.open(..., "wb")
에 의해 파일이 지워집니다.방법이 있습니까? 감사.
새로운 정보
내가 먼저 파일을 열 수 있고 그것의 내용을 쓸어하지 않습니다, 다음 잠금을 시도 할 수 있도록 하나의 방법은,
"File::RDWR|File::CREAT"
를 사용하는 것입니다 생각합니다. 다른 방법이 있는지 확실하지 않지만"wb"
은 아마도 작동하지 않습니다. 나는 이것이 Ruby의 어색함이라고 생각한다. 자물쇠를 얻기 전에 먼저 파일을 열어야한다. 나는이 두 단계가 원자 적이어야한다고 생각한다.
감사합니다. – user180574
Phillip, 타이밍 문제에 부딪치지 않고이를 수행하는 방법에 대해 생각하고 있습니다. 예를 들어, "path/to/file.txt.lock"이 쓰기 모드로 작성되기 전에 존재하지 않는다는 것을 확인하는 것은 파일이 두 조작의 실행 사이에 작성 될 수 있기 때.입니다. 하나의 가능성은 잠금을 얻기 위해 데이터베이스를 사용하는 것입니다. 'IO' 메소드로이 일을하는 안전하고 쉬운 방법이 있습니까? –
쓰기 위해 잠금 파일을 엽니 다. 그런 다음 자물쇠를 잡으려고하십시오. 얼마나 많은 프로세스가 잠금 파일을 열지는 중요하지 않습니다. 단지 그들 중 하나만 독점 자물쇠를 얻을 수 있습니다. –