상위 및 하위 프로세스에서 디렉터리 스트림(DIR*)을 닫는 것이 안전합니까?

상위 및 하위 프로세스에서 디렉터리 스트림(DIR*)을 닫는 것이 안전합니까?

이 페이지함수의 보장된 동작을 설명 readdir하고 readdir_r다음 문장을 포함합니다.

fork()를 호출한 후 부모 또는 자식(둘 다는 아님)이 readdir(), rewinddir() 또는 eekdir()을 사용하여 디렉터리 스트림 처리를 계속할 수 있습니다. 상위 프로세스와 하위 프로세스가 모두 이러한 기능을 사용하는 경우 결과는 정의되지 않습니다.

연습삼아 관련 기능 계열에 대한 포크 안전 래퍼를 작성하고 있는데 , 이것이 부모와 자식 모두의 디렉터리 스트림에 동시에 안전한지, 아니면 프로세스가 안전한지 DIR*알고 싶습니다.closedir아니요디렉터리 스트림에서 계속해서 읽으면 디렉터리 스트림과 전혀 상호 작용하지 않아야 합니다.

답변1

일반적인 의견으로 다음을 참조하는 것이 좋습니다.현재 설명readdir(여기에서는 아무것도 변경되지 않습니다).

closedir실제로는 두 가지 작업을 수행합니다. 디렉터리 스트림을 추적하기 위해 C 라이브러리에서 할당한 메모리를 해제하고 opendir// 일련의 함수가 파일 설명자를 사용하여 구현된 경우 파일 설명자를 닫습니다 readdir. closedir두 작업 모두 기본 상위 또는 하위 프로세스가 아닌 이를 호출하는 프로세스에 적용됩니다 fork. 디렉터리 스트림을 해제하면 호출 프로세스의 메모리에만 영향을 미칩니다(필요한 경우 프로세스 변경과 관계없이 조작하기 위해 관련 페이지의 복사본을 생성). 쓰기 시 복사의 공유 메모리 매핑이 있는 프로세스 fork), 파일 설명자를 닫는 것은 현재 프로세스에만 영향을 미칩니다(다른 프로세스에 기본 파일 설명을 공유하는 파일 설명자가 있는 경우 파일 설명은 해제되지 않습니다).

따라서 readdir공유 디렉터리 스트림의 다른 프로세스에서 호출하는 것은 안전하지 않지만(기본 공유 파일 설명으로 인해) closedir안전합니다.

관련 정보