2014-02-14 4 views
1

이것은 매우 간단하지만 작동하지 않는 것 같습니다. 저는 Ruby의 File#flock 메소드를 사용하고 있습니다. 먼저 파일을 잠근 다음 잠금을 해제 한 다음 잠금을 다시 시도합니다. 두 번째 잠금은 파일이 잠긴 것처럼 실패합니다. 다음은 irb 세션의 직접 복사 붙여 넣기입니다. Ubuntu 13.04에서 실행되는 Ruby 2.1.0p0을 사용하고 있습니다.Ruby의 File :: LOCK_UN이 작동하지 않는 것 같습니다.

$ irb 
>> File.open('/tmp/asdf', 'r+').flock(File::LOCK_EX) 
=> 0 
>> File.open('/tmp/asdf', 'r+').flock(File::LOCK_UN) 
=> 0 
>> File.open('/tmp/asdf', 'r+').flock(File::LOCK_EX) 
^CIRB::Abort: abort then interrupt! 
     from (irb):3:in `call' 
     from (irb):3:in `flock' 
     from (irb):3 
     from /usr/local/rvm/rubies/ruby-2.1.0/bin/irb:11:in `<main>' 

두 번째 LOCK_EX 시도는 파일이 여전히 잠겨있는 경우처럼 중단됩니다. 위의 복사 - 붙여 넣기에서 볼 수 있듯이 Ctrl-C를 사용하여 두 번째 시도를 중단해야했습니다.

여기서 잠금 해제가 작동하지 않는 이유는 무엇입니까?

참고로, 내가 이것을 필요로하는 이유는 뮤텍스와 동등한 것을 얻으려고하지만 스레드 대신에 프로세스를 가로 지르기 때문입니다. 내가 온라인으로 읽은 것에 따르면, 파일 잠금으로 충분할 것입니다.

답변

1

사실, 질문을 게시 한 직후에 알아 냈습니다. 돌이켜 보면 분명하지만 LOCK_UN은 같은 파일 핸들을 사용하여 작업해야합니다. 좋아요 :

$ irb 
>> f = File.open('/tmp/asdf', 'r+') 
=> #<File:/tmp/asdf> 
>> f.flock(File::LOCK_EX) 
=> 0 
>> f.flock(File::LOCK_UN) 
=> 0 
>> f = File.open('/tmp/asdf', 'r+') 
=> #<File:/tmp/asdf> 
>> f.flock(File::LOCK_EX) 
=> 0