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
mv
rename
시스템 호출과 원자성을 기반으로 합니다 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
사용하여 쉽고 안전하게 구현할 수 있습니다.