최신 mtime을 읽을 수 있지만 읽은 내용이 아직 업데이트되지 않았습니까?

최신 mtime을 읽을 수 있지만 읽은 내용이 아직 업데이트되지 않았습니까?

touch등이 관련되지 않고 표준 open, write, close, link시스템 호출 만 포함된다고 가정합니다 .

한 프로세스는 파일을 업데이트하고 다른 프로세스는 정기적으로 파일이 stat변경되었는지 확인하고 내용을 다시 로드합니다. 첫 번째 프로세스가 쓰기를 완료하기 전에 두 번째 프로세스가 다시 로드되면 파일이 잘못된 뷰로 끝날 수 있습니까?

주로 Linux ext4 파일 시스템에 중점을 두지만 이 정보는 다른 파일 시스템과 다를 경우 유용할 수 있습니다.

답변1

POSIX에서는 다음에 따라 항상 올바른 데이터를 반환하기 위해 쓰기 후 읽기()가 필요합니다.http://pubs.opengroup.org/onlinepubs/007908799/xsh/write.html:

일반 파일의 write()가 성공적으로 반환된 후:

  • 이 쓰기로 수정된 파일의 각 바이트 위치에 대해 성공적인 read()는 해당 바이트 위치가 다시 수정될 때까지 해당 위치에서 write()로 지정된 데이터를 반환합니다.

Linux에서는 쓰기가 완료될 때까지 mtime 파일이 업데이트되지 않으므로해서는 안 된다결과 데이터를 보지 않고도 업데이트된 mtime을 볼 수 있습니다.저것시간에 맞춰 갱신됩니다.

nbyte가 0보다 큰 성공적으로 완료되면 파일의 st_ctime 및 st_mtime 필드를 업데이트하도록 write()가 표시됩니다.

Ext4는 POSIX 규격을 준수하려고 시도하므로 이 경우 안전해야 합니다. 그러나 모든 파일 시스템이 POSIX 규격을 완전히 준수하는 것은 아니므로 YMMV입니다.

답변2

원하는 세분성에 따라 다릅니다. 단일 write()호출은 원자성(*)이어야 합니다. 그러나 애플리케이션이 단일 논리 작업의 일부로 여러 쓰기 호출을 수행하는 경우 다른 프로세스가 중간에 깨어나 그 중 일부만 읽을 수 있습니다.

*) 시스템 호출은 반환 값에 표시될 데이터의 일부만 쓴 후 반환됩니다. 그러나 이것이 Linux의 로컬 파일에서 발생하는지 모르겠습니다.

다음 순서를 고려하세요.

--task 1--                  --task 2--
write()                     ..  
..                          stat()
..                          read()
write()                        

왼쪽의 두 쓰기가 단일 논리적 수정의 일부인 경우 작업 2는 해당 수정의 일부만 읽습니다.

관련 정보