내 fs에 mv 원자가 있습니까?

내 fs에 mv 원자가 있습니까?

mv내 fs(ext4)가 원자성인지 어떻게 확인할 수 있나요 ?

운영 체제는 Red Hat Enterprise Linux Server 버전 6.8입니다.

일반적으로 이를 어떻게 확인하나요? 주위를 둘러보았지만 내 OS가 표준 POSIX인지 찾지 못했습니다.

답변1

흥미롭게도 대답은 "상황에 따라 다르다"인 것 같습니다.

확실하게,mv지정됨도착하다

유틸리티 mv회사는 다음과 같은 조치를 취해야 합니다.rename() 기능

이것함수 사양 이름 바꾸기상태:

일반 파일의 경우 이 rename()기능은 ISO C 표준에 정의된 기능과 동일합니다. 여기에 포함은 디렉터리에 대한 작업을 포함하도록 정의를 확장하고 새 매개 변수가 이미 존재하는 파일에 이름을 지정할 때의 동작을 지정합니다.사양에서는 함수 작업이 원자적이어야 합니다.

하지만 최신ISO C 사양상태 의 경우 rename():

7.21.4.2 rename기능

요약

#include <stdio.h>
int rename(const char *old, const char *new);

설명하다

rename함수는 가리키는 문자열이라는 이름의 파일이 old앞으로는 가리키는 문자열이 제공하는 이름으로 식별되도록 합니다 new. 지정된 파일은 old더 이상 이 이름으로 액세스할 수 없습니다. new이 함수를 호출하기 전에 가리키는 문자열로 명명된 파일이 존재하는 경우 rename동작은 구현에 따라 정의됩니다.

상품을 반품하다

이 함수는 작업이 성공하면 0을 반환 rename하고 실패하면 0이 아닌 값을 반환합니다. 이 경우 파일이 이전에 존재했다면 원래 이름으로 계속 식별할 수 있습니다.

놀랍게도 원자성에 대한 명시적인 요구 사항은 없습니다. 최신 공개 C 표준의 다른 곳에서 필요할 수도 있지만 아직 찾지 못했습니다. 누구든지 그러한 필요성을 발견할 수 있다면 편집과 의견을 환영합니다.

당신은 또한 볼 수 있습니다rename()은 원자적입니까?

모든리눅스 매뉴얼 페이지:

이미 존재 하는 경우 newpath해당 항목에 액세스하려는 다른 프로세스에서 누락된 항목을 찾을 수 없도록 자동으로 교체됩니다 newpath. 그러나 이름이 바뀌는 파일을 참조하는 oldpath창이 나타날 수 있습니다 .newpath

Linux 매뉴얼 페이지 주장대안파일의 내용은 원자적입니다.

시험그리고확인하다그러나 이를 수행해야 하는 경우 원자성은 매우 어려울 수 있습니다. "mv가 원자인지 확인하는 방법"이 무엇을 의미하는지 명확하지 않습니다. 원자성에 대한 요구 사항/사양/문서화가 필요합니까, 아니면 실제로 필요합니까?시험그것?

위의 내용도 참고해주세요가설두 피연산자 파일 이름이 모두 동일한 파일 시스템에 있습니다. mv이 작업을 수행하는 유틸리티에 대한 표준 제한 사항을 찾을 수 없습니다 .

답변2

mvrename시스템 호출과 원자성을 기반으로 합니다 rename(). 맨페이지를 볼 수 있습니다 rename(2).

당신은 답을 찾을 수 있습니다rename()은 원자적입니까?스택 오버플로에.

어떤 유형의 fs를 사용하고 있습니까?

답변3

아마도 시스템 호출과 그 원자성을 확인하는 것 외에 테스트일 수도 있지만 inotify-tools이것이 원자성의 보장된 증거인지는 확실하지 않습니다.

껍질 2개를 엽니다. 다음 중 하나에서 이동된 대상 디렉터리를 관찰합니다.

inotifywait -m target/

파일을 다른 디렉터리로 이동합니다.

mv foobar target/

한 줄만 표시 되어야 합니다 inotifywait.

target/ MOVED_TO foobar

ls target/의 응답과 비교하면 touch target/a원자적인 것으로 보이며 다음 과 같은 여러 줄의 메시지를 생성합니다.

# the response to ls target/
target/ OPEN,ISDIR 
target/ ACCESS,ISDIR 
target/ CLOSE_NOWRITE,CLOSE,ISDIR 

폴리스티렌

내 생각에는 적어도 파일에 대한 비동기 다중 프로세스 협력이 안전하다는 것을 보여줍니다 inotify(사실 원자적). 어쨌든 inotify작업 후 최종 신호를 보낸 후에만 응답합니다. 예를 들어 생산자-소비자 설정은 다음을 inotify사용하여 쉽고 안전하게 구현할 수 있습니다.

관련 정보