다음 명령을 실행할 때:
exec 3<<< "TEST"
다음이 나타나는 것을 볼 수 있습니다 /proc
(FD3 읽기에 관한 마지막 줄이 제거되었습니다).
# ls -al /proc/$$/fd
total 0
dr-x------ 2 root root 0 Jan 18 21:09 .
dr-xr-xr-x 9 root root 0 Jan 18 21:09 ..
lrwx------ 1 root root 64 Jan 28 16:22 0 -> /dev/pts/0
lrwx------ 1 root root 64 Jan 28 16:22 1 -> /dev/pts/0
lrwx------ 1 root root 64 Jan 18 21:09 2 -> /dev/pts/0
lrwx------ 1 root root 64 Jan 28 16:22 255 -> /dev/pts/0
lr-x------ 1 root root 64 Jan 28 20:42 3 -> /tmp/sh-thd-1123912022914878506 (deleted)
FD 3의 내용을 한 번 읽을 수 있지만 그 이후에는 읽을 수 없습니다.
# cat 0<&3
TEST
# cat 0<&3
# cat 0<&3
내 질문은 /proc/$$/fd/3
이미 "삭제됨"으로 읽힌 경우 해당 내용을 계속 읽을 수 있는 이유에 대한 이론이 무엇입니까?
답변1
파일 설명자에서 계속 읽을 수 있습니다. 문제는 "dup2" 시스템 호출을 사용하여 파일 설명자에 대한 두 번째 참조를 만들고 파일 설명자에 위치가 있다는 것입니다. 이 위치는 첫 번째 고양이 다음으로 데이터 끝 부분에 있습니다. 한 번에 조금씩 데이터를 읽을 수 있습니다(여기서는 read
한 번에 한 줄씩 읽는 예를 들었고 일반적으로 read -r을 사용합니다). 위치를 되돌리는 간단한 방법으로 Perl을 사용하고 있습니다. 파일의 시작 부분에.
$ exec 3<<<'This is some text
> and some more
> that is all folks'
$ read <&3 ; echo "$REPLY"
This is some text
$ read <&3 ; echo "$REPLY"
and some more
$ perl -e 'sysseek(stdin,0,0);' <&3
$ read <&3 ; echo "$REPLY"
This is some text
답변2
파일을 가리키는 디렉토리 항목이 더 이상 없으면 파일이 "삭제"됩니다. 이러한 의미에서 파일은 삭제되었지만 디스크에는 여전히 존재할 수 있습니다. 이것인덱스 노드파일의 내용과 파일의 내용은 파일을 닫을 때까지 삭제되지 않습니다.
파일에 디렉터리 항목이 없으면 직접 열 수 없습니다. 그러나 기존 설명자는 여전히 파일에 복사될 수 있으며 이것이 바로 리디렉션입니다./proc/PID/fd/FD
시스템이 충돌하고 파일이 여전히 열려 있지만 삭제된 경우 데이터는 나중에 삭제됩니다. 다음 시작 시 로그가 재생될 때 또는 다음을 통해FSCK이를 감지하면링크 수0과 같습니다.
답변3
파일 설명자를 닫지 않았으므로 해당 리소스가 해제되지 않았습니다. 그러나 해당 파일 설명자에서 사용 가능한 모든 내용을 읽었습니다. 향후 읽기는 즉시 EOF를 얻지만 파일 설명자는 아직 닫히지 않았으므로 여전히 존재합니다.