
나는 다음과 같이 Makefile 규칙을 작성하고 있습니다.
out/%.x: ...
mkdir -p $(@D)/
...
-j
나는 이 Makefile( )을 병렬화하여 많은 mkdir -p
을 동시에 트리거할 계획 입니다.
이거 안전한가요? 아니면 mkdir -p
한 번만 발생하도록 하여 문제를 방지해야 합니까 ?
(메모mkdir -p
와 달리 파일 시스템 수준에서 반드시 단일 작업은 아닙니다 . mkdir
)
답변1
에 대한 이론적 근거POSIXmkdir
라고
경로 구성 요소가 이미 존재하는 경우 오류가 발생하지 않으므로-피옵션은 특정 디렉터리가 존재하는지 확인하는 데에도 유용합니다.
이는 병렬 사용이 안전해야 함을 의미합니다. 경주의 가능성을 고려할 때 귀하의 의심을 이해할 수 있으므로 구현을 살펴보겠습니다.
GNU에서 coreutils
옵션은 -p
결국 다음에 의해 처리됩니다.mkancesdirs
, 귀하의 두려움을 완화시키는 유용한 설명이 있습니다.
두 프로세스가 이 기능을 병렬로 실행하는 경우에도 작동해야 하는 알고리즘을 사용하여 FILE의 상위 디렉터리가 존재하는지 확인합니다.
( 의 오류에 즉시 조치를 취하는 대신 각 구성 요소 디렉터리에 mkdir
시도하고 chdir
실패할 경우에만 실패합니다.)
GNU Make를 사용한다면,2차 확장다른 전제조건과 동일한 방식으로 디렉토리를 처리하려면 다음을 수행하십시오.
.SECONDEXPANSION:
%/:
mkdir -p $@
out/%.x: $$(@D)/ ...
...