В ОС на основе Debian (Ubuntu, Debian Squeeze) я использую Python (2.7, 3.2) fcntl для блокировки файла.Как я понял из прочитанного, fnctl.flock блокирует файл таким образом, что будет сгенерировано исключение, если другой клиент захочет заблокировать тот же файл.
Я создал небольшой пример, который я ожидалбросить исключение, так как я сначала блокирую файл, а затем, сразу после этого, пытаюсь снова его заблокировать:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import fcntl
fcntl.flock(open('/tmp/locktest', 'r'), fcntl.LOCK_EX)
try:
fcntl.flock(open('/tmp/locktest', 'r'), fcntl.LOCK_EX | fcntl.LOCK_NB)
except IOError:
print("can't immediately write-lock the file ($!), blocking ...")
else:
print("No error")
Но в примере просто выводится «Нет ошибки».
Если я разделю этот код на два клиента, работающих одновременно (один блокируется, а затем ожидает, другой пытается заблокировать после того, как первая блокировка уже активна), я получаю то же самое поведение - никакого эффекта привсе.
Чем объясняется такое поведение?
РЕДАКТИРОВАТЬ :
Изменения в соответствии с запросом nightcracker, эта версия также печатает «Нет ошибок»,хотя я бы не ожидал, что:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import fcntl
import time
fcntl.flock(open('/tmp/locktest', 'w'), fcntl.LOCK_EX | fcntl.LOCK_NB)
try:
fcntl.flock(open('/tmp/locktest', 'w'), fcntl.LOCK_EX | fcntl.LOCK_NB)
except IOError:
print("can't immediately write-lock the file ($!), blocking ...")
else:
print("No error")