Дублирование файлового дескриптора, связанного с блокировкой fcntl?

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

Однако, если дескриптор файла, который мы пытаемся скопировать, имеет связанную с ним блокировку fcntl, получает ли новый дескриптор файла новую блокировку?

0
15.09.2016, 16:03
1 ответ

Блокировки Posix (F_SETLK и т.д.) связаны с процессом, поэтому после dup2() у вас остается только одна блокировка на файл. Вы можете перечислить свои блокировки с помощью lslocks. Если вы закроете один из двух fds, вы сбросите блокировку. Если вы измените блокировку одного из fds, другой тоже изменится. После fork() у ребенка нет блокировок. Подробности см. на странице fcntl man. Эта спецификация Posix говорит, что dup2() будет разделять любые блокировки.

Вы можете делать простые тесты в Python, используя lockf() для простоты использования, так как он реализован через fcntl(), например:

#!/usr/bin/python
import os, fcntl
pid = os.getpid()
fd = open("/tmp/try","rw")
fcntl.lockf(fd,fcntl.LOCK_SH,10)
fd2 = os.dup(fd.fileno())
os.system("lslocks -p %d" % pid) # one lock
fd.close()
os.system("lslocks -p %d" % pid) # no output
1
28.01.2020, 02:47

Теги

Похожие вопросы