UNIX 시스템이 사용 중인 디스크의 파일을 실제로 삭제하지 않는다는 것은 잘 알려져 있습니다. 따라서 프로세스 1이 파일에 액세스하고 프로세스 2가 rm을 사용하여 파일을 삭제하는 경우 프로세스 1은 추가로 파일을 계속 봅니다. /proc/(프로세스 1 id)/fd의 파일 설명자 링크는 해당 파일이 삭제되었음을 보고합니다. 파일의 원본 내용을 삭제합니다.
그러나 프로세스 2가 파일을 삭제하는 대신 파일을 덮어쓰는 경우(예: echo "abracadabra" > file.txt 사용) /proc/(process 1 id)/fd에 있는 파일 설명자 링크는 덮어쓰기 자료("abracadabra")를 보고합니다. 프로세스 1은 여전히 파일의 원래 내용에 액세스할 수 있습니다. 왜 그런 차이가 있습니까?
[편집] 다음 클립은 Jim Paris에 대한 응답입니다.
>uname -a
Linux ravoori-netbook 3.2.0-32-generic-pae #51-Ubuntu SMP Wed Sep 26 21:54:23 UT
C 2012 i686 i686 i386 GNU/Linux
>echo original > /tmp/foo
>tail -0f /tmp/foo &
[2] 6144
>rm /tmp/foo
>cat /proc/6144/fd/3
original
>echo abracadabra > /tmp/foo
>cat /proc/6144/fd/3
original
답변1
프로세스 2가 파일을 덮어쓰기 전에 프로세스 1이 파일 읽기를 시작한 경우 내용의 일부를 버퍼에 저장합니다 stdio
. 버퍼 크기 경계를 초과하면 커널에 강제로 들어가고 새 오버레이 콘텐츠를 찾습니다.
답변2
그러나 프로세스 2가 파일을 삭제하는 대신 파일을 덮어쓰는 경우(예: echo "abracadabra" > file.txt 사용) /proc/(process 1 id)/fd에 있는 파일 설명자 링크는 덮어쓰기 자료("abracadabra")를 보고합니다. 프로세스 1은 여전히 원본 파일의 원본 콘텐츠에 액세스할 수 있습니다.
나는 동의하지 않는다:
$ echo original > /tmp/foo
$ tail -0f /tmp/foo &
[1] 20591
$ rm /tmp/foo
$ cat /proc/20591/fd/3
original
$ echo abracadabra > /tmp/foo
$ cat /proc/20591/fd/3
original
링크 fd
에는 귀하가 주장하는 내용과 달리 원본 콘텐츠가 계속 표시됩니다. Linux 3.5의 경우입니다. 뭔가 다른 게 보이나요?