2014-12-04 3 views
1

는 내가 달성하고자하는 것은 이것이다 : 다른 프로세스가 잠금을 보유하는 경우, 그렇지 않으면 내가 수정하려고 루비 코드는 Ruby : 쓰기 위해 파일 잠금을 얻는 방법은 무엇입니까?

을 작성하기위한 잠금을 획득

  • 을 종료

    1. .

      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의 어색함이라고 생각한다. 자물쇠를 얻기 전에 먼저 파일을 열어야한다. 나는이 두 단계가 원자 적이어야한다고 생각한다.

  • 답변

    0

    잠금 파일을 만들고 잠금을 대신 사용하십시오. filename이 "path/to/file.txt"라고 말하면 "path/to/file.txt.lock"에 잠금을 설정하십시오. 잠금 파일에 대한 잠금을 획득하면 정상적으로 실제 파일을 편집하십시오.

    +0

    감사합니다. – user180574

    +0

    Phillip, 타이밍 문제에 부딪치지 않고이를 수행하는 방법에 대해 생각하고 있습니다. 예를 들어, "path/to/file.txt.lock"이 쓰기 모드로 작성되기 전에 존재하지 않는다는 것을 확인하는 것은 파일이 두 조작의 실행 사이에 작성 될 수 있기 때.입니다. 하나의 가능성은 잠금을 얻기 위해 데이터베이스를 사용하는 것입니다. 'IO' 메소드로이 일을하는 안전하고 쉬운 방법이 있습니까? –

    +0

    쓰기 위해 잠금 파일을 엽니 다. 그런 다음 자물쇠를 잡으려고하십시오. 얼마나 많은 프로세스가 잠금 파일을 열지는 중요하지 않습니다. 단지 그들 중 하나만 독점 자물쇠를 얻을 수 있습니다. –