외부에서 프로세스를 보면 어떤 파일이 수정되었는지 어떻게 알 수 있나요?
내가 할 수 있는 한 가지는 쓰기 호출을 추적하는 것이지만 프로세스는 파일을 메모리에 매핑하고 메모리 수정 파일을 쓸 수 있습니다.
커널에는 두 가지 이유로 추적이 필요합니다. sync가 호출될 때 무엇을 플러시해야 하는지 알아야 하며 파일의 mtime을 업데이트해야 합니다.
그렇다면 시스템은 어떻게 알 수 있나요?
쓰기 및 mmap 외에 파일을 수정하는 다른 방법이 있습니까?
답변1
커널은 다른 페이지와 마찬가지로 어떤 페이지가 수정되었는지 알고 있습니다. 쓰기가 이루어지면 페이지 테이블의 플래그가 "더티"로 표시되도록 설정됩니다. 이는 CPU나 MMU에 의해 또는 CPU나 MMU의 도움을 받아 수행될 수 있습니다(예를 들어 비트를 직접 설정하거나 인터럽트를 발생시키고 소프트웨어가 수행하도록 할 수 있음).
그러나 실제로는 가정한 동작이 보장되지 않습니다. 변경된 페이지는 msync
또는 호출될 때까지 다시 쓸 필요가 없습니다(또는 쓰기 저장을 위해 대기열에 넣을 수도 있음) .munmap
파일을 수정하는 다른 방법이 얼마나 많은지는 잘 모르겠지만 적어도 몇 가지가 있습니다.
truncate
/ftruncate
writev
,pwritev
,aio_write
(의 변형write
)- 스왑 파일, 루프백 장치용 백업 장치(예: /dev/loop0) 등으로 사용합니다.
ioctl
파일 내용을 변경하는 호출이 있을 수 있습니다 . 더 나쁜 것은 파일 시스템에 따라 다를 수 있다는 것입니다.