mv
내 fs (ext4)의 원자 인지 어떻게 확인할 수 있습니까?
OS는 Red Hat Enterprise Linux Server 릴리즈 6.8입니다.
일반적으로 어떻게 확인할 수 있습니까? 주변을 둘러 보았고 OS가 표준 POSIX인지 찾지 못했습니다.
mv
내 fs (ext4)의 원자 인지 어떻게 확인할 수 있습니까?
OS는 Red Hat Enterprise Linux Server 릴리즈 6.8입니다.
일반적으로 어떻게 확인할 수 있습니까? 주변을 둘러 보았고 OS가 표준 POSIX인지 찾지 못했습니다.
답변:
흥미롭게도 대답은 "그것은 달려있다"고 생각됩니다.
명확하게하기 위해, 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
함수를 호출하기 전에 존재 하면 동작이 구현 정의됩니다.보고
rename
작업이 성공하면 이 함수는 0을, 실패하면 0이 아닌 값을 반환합니다.이 경우 파일이 이전에 존재 한 경우 여전히 원래 이름으로 알려집니다.
놀랍게도 원자성에 대한 명시적인 요구 사항이 없다는 점에 유의하십시오. 공개적으로 사용 가능한 최신 C 표준 어딘가에 필요할 수 있지만 찾을 수 없었습니다. 누구든지 그러한 요구 사항을 찾을 수 있다면 편집 및 의견을 환영합니다.
또한 rename ()이 원 자성입니까?를 참조하십시오 .
당 리눅스 맨 페이지 :
newpath
이미 존재하는 경우 원자 적으로 대체되므로 액세스하려는 다른 프로세스newpath
가 누락 된 지점 이 없습니다. 그러나 아마 모두있는 창이있을 것입니다oldpath
및newpath
파일을 참조 이름이 변경된다.
리눅스 매뉴얼 페이지 는 파일 교체 가 원자 적이라고 주장한다 .
그러나 원자력을 테스트 하고 확인 하는 것이 얼마나 멀리해야하는지 매우 어려울 수 있습니다. "mv가 원자 적인지 어떻게 확인할 수 있는지"를 사용할 때의 의미에 대해서는 명확하지 않습니다. 원자 성인 요구 사항 / 사양 / 문서를 원 하십니까? 아니면 실제로 테스트 해야합니까?
또한 위 의 두 피연산자 파일 이름이 동일한 파일 시스템에 있다고 가정 합니다. mv
유틸리티 에 대한 표준 제한을 찾을 수 없습니다 .
rename
원자성에 대해 언급하는 것은 이상 할 것 입니다.
/
ext4 fs와 /tmp
다른 ext4 fs를 가지고 있다면 , 원자 적으로 mv를 mv 할 수 없습니다 .
mv
rename
시스템 호출을 기반으로 하며 rename()
원자 적입니다. 맨 페이지를 볼 수 rename(2)
있습니다.
당신 은 rename () atomic? 에 대한 답변을 찾을 수 있습니다 스택 오버 플로우.
어떤 종류의 fs를 사용 했습니까?
시스템 호출과 그 원 자성을 확인하는 것 외에도 inotify-tools
테스트가 될 수 있지만 원자 성의 보장 증거인지 확실하지 않습니다.
껍질 2 개를 엽니 다. 다음 중 하나의 이동 대상 디렉토리를보십시오.
inotifywait -m target/
파일을 다른 디렉토리로 이동하십시오.
mv foobar target/
은 inotifywait
하나 개의 라인을 표시해야합니다 :
target/ MOVED_TO foobar
ls target/
and 에 대한 응답 과 비교하여 원자 적으로 보입니다 touch target/a
.
# the response to ls target/
target/ OPEN,ISDIR
target/ ACCESS,ISDIR
target/ CLOSE_NOWRITE,CLOSE,ISDIR
추신
적어도 파일에 대한 비동기 다중 프로세스 협력이 inotify
(실제로 원자 적) 안전하다는 것을 보여줍니다 . 어쨌든 inotify
작업 후 최종 신호를 준 후에 만 응답 합니다. 예를 들어, 생산자-소비자 설정은으로 쉽고 안전하게 구현할 수 있습니다 inotify
.
strace
?