매뉴얼 페이지에 따르면 dup2
이 시스템 호출은 이전 파일 설명자의 새 복사본을 생성합니다. 두 설명자는 공유되지 않습니다(close-on-exec 플래그).
그러나 복사하려는 파일 설명자에 fcntl 잠금이 연결되어 있으면 새 파일 설명자가 새 잠금을 얻습니까?
답변1
Posix 잠금(F_SETLK 등)은 프로세스와 연결되어 있으므로 a 이후에도 dup2()
파일에 대한 잠금은 하나만 유지됩니다. 를 사용하여 잠금 목록을 나열할 수 있습니다 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