![최신 mtime을 읽을 수 있지만 읽은 내용이 아직 업데이트되지 않았습니까?](https://linux55.com/image/107272/%EC%B5%9C%EC%8B%A0%20mtime%EC%9D%84%20%EC%9D%BD%EC%9D%84%20%EC%88%98%20%EC%9E%88%EC%A7%80%EB%A7%8C%20%EC%9D%BD%EC%9D%80%20%EB%82%B4%EC%9A%A9%EC%9D%B4%20%EC%95%84%EC%A7%81%20%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8%EB%90%98%EC%A7%80%20%EC%95%8A%EC%95%98%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
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는 해당 수정의 일부만 읽습니다.