태그 보관물: move

move

mv는 내 fs에 원자입니까? Server 릴리즈 6.8입니다. 일반적으로

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이 지정된 파일은 해당 이름 으로 더 이상 액세스 할 수 없습니다. 로 표시된 문자열로 명명 된 파일 newrename함수를 호출하기 전에 존재 하면 동작이 구현 정의됩니다.

보고

rename작업이 성공하면 이 함수는 0을, 실패하면 0이 아닌 값을 반환합니다.이 경우 파일이 이전에 존재 한 경우 여전히 원래 이름으로 알려집니다.

놀랍게도 원자성에 대한 명시적인 요구 사항이 없다는 점에 유의하십시오. 공개적으로 사용 가능한 최신 C 표준 어딘가에 필요할 수 있지만 찾을 수 없었습니다. 누구든지 그러한 요구 사항을 찾을 수 있다면 편집 및 의견을 환영합니다.

또한 rename ()이 원 자성입니까?를 참조하십시오 .

리눅스 맨 페이지 :

newpath이미 존재하는 경우 원자 적으로 대체되므로 액세스하려는 다른 프로세스 newpath가 누락 된 지점
이 없습니다. 그러나 아마 모두있는 창이있을 것입니다 oldpathnewpath파일을 참조 이름이 변경된다.

리눅스 매뉴얼 페이지 는 파일 교체 가 원자 적이라고 주장한다 .

그러나 원자력을 테스트 하고 확인 하는 것이 얼마나 멀리해야하는지 매우 어려울 수 있습니다. “mv가 원자 적인지 어떻게 확인할 수 있는지”를 사용할 때의 의미에 대해서는 명확하지 않습니다. 원자 성인 요구 사항 / 사양 / 문서를 원 하십니까? 아니면 실제로 테스트 해야합니까?

또한 위 의 두 피연산자 파일 이름이 동일한 파일 시스템에 있다고 가정 합니다. mv유틸리티 에 대한 표준 제한을 찾을 수 없습니다 .


답변

mvrename시스템 호출을 기반으로 하며 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.


답변