Файл Ruby::LOCK_UN не работает

Это очень просто, но, похоже, не работает. Я использую метод File # flock в Ruby. Сначала я блокирую файл, затем снимаю блокировку, затем пытаюсь снова его заблокировать. Вторая блокировка завершается ошибкой, как будто файл все еще заблокирован. Вот прямая копия вставки из сеанса IRB. Я использую Ruby 2.1.0p0 на Ubuntu 13.04.

$ 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.

Есть идеи, почему здесь не работает разблокировка?

Для справки, причина, по которой я нуждаюсь в этом, состоит в том, что я пытаюсь получить эквивалент Mutex, но через процессы вместо потоков. Согласно тому, что я читаю онлайн, для этого должно быть достаточно блокировки файла.

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
Другие вопросы по тегам