マニュアルページによると、dup2
このシステムコールは古いファイル記述子の新しいコピーを作成します。両方の記述子は共有されません(close-on-execフラグ)。
しかし、コピーしたいファイル記述子にfcntlロックが関連付けられている場合、新しいファイル記述子は新しいロックを取得しますか?
答え1
Posixロック(F_SETLKなど)はプロセスに関連付けられているため、a以降でもdup2()
ファイルのロックは1つだけ保持されます。を使用してロックリストを一覧表示できますlslocks
。 2つのfdのいずれかを閉じるとロックが解除されます。ある fd のロックを変更すると、他の fd も変更されます。その後、fork()
子供のロックが解除されます。詳細については、マニュアルページを参照してくださいfcntl
。これPosix 仕様dup2()
ストーリーすべてのロックを共有。
lockf()
使いやすさのために実装する簡単なテストにPythonを使用できます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