Согласно странице руководства dup2
, этот системный вызов создает новую копию старого файлового дескриптора. Два дескриптора не используются совместно (флаг закрытия при выполнении).
Однако, если дескриптор файла, который мы пытаемся скопировать, имеет связанную с ним блокировку fcntl, получает ли новый дескриптор файла новую блокировку?
Блокировки 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