파일 설명자 47은 무엇에 사용됩니까?

파일 설명자 47은 무엇에 사용됩니까?

달려가면서 알아차렸어

ls /proc/self/fd

다음과 같은 결과가 나타납니다.

0  1  2  3  47

분명히 , 01는 각각 , 및 의 설명자이며 2디렉토리에 액세스하는 데 사용되는 설명자입니다.stdinstdoutstderr3ls

하지만 무엇입니까 47? 실행 중인 출력은 다음과 ls같기 때문에 (특정 항목이 아닌) 셸에서 전달된 항목이어야 합니다 .cat

$ cat /proc/self/fd/47
cat: /proc/self/fd/47: Permission denied

# example of running cat on a non-existent file descriptor
$ cat /proc/self/fd/46
cat: /proc/self/fd/46: No such file or directory

ls -l에 연결되어 있다고 합니다 anon_inode:inotify.

저는 KDE와 함께 Arch Linux를 사용하고 있는데 tty에서 명령을 실행하면 이런 일이 발생하지 않는 것 같기 때문에 이것이 중요한 것 같습니다. 터미널에 특정할 수도 있지만(저는 Konsole을 사용하고 있습니다) 쉘에 특정하지 않습니다( 및 둘 다에서 발생합니다 bash) . zsh어쨌든, 쉘은 exec 전에 0-2를 제외한 모든 설명자를 닫아야 하지 않습니까(또는 그렇게 표시해야 합니까 O_CLOEXEC)?

저는 KDE 플라즈마 5.27.10을 실행하고 있습니다.

편집: sudo0-2를 제외한 모든 설명자를 닫은 상태에서 테스트한 결과 sudo konsole이 ​​새 터미널 내부의 인스턴스는 설명자를 새 프로세스로 zsh유출하지 않습니다 . 이는 Konsole 자체에는 아무런 문제가 없지만 47부모로부터 plasmashell설명자를 받고 있음을 의미합니다.

답변1

FD 47에는 특별한 것이 없습니다. 적어도 기준은 없습니다.

파일 설명자가 열리면 다른 프로그램에 대한 exec() 호출 시 파일 설명자를 닫아야 하는지 여부를 나타내는 플래그가 설정될 수 있습니다. 대부분의 프로그램은 처음 3개(때때로 4개) 이상의 열린 파일 설명자를 무시하므로, 파일이 열려 있고 exec에서 열린 상태로 표시되면 여러 단계를 통과할 수 있습니다. 프로그램은 열린 상태로 유지됩니다. 실수로 열었을 가능성이 높습니다. 이는 파일 설명자 누출 오류입니다. 열린 항목을 추적하는 것은 어려울 수 있습니다. 특히 열린 항목이 더 이상 실행되지 않을 수 있다는 점을 고려하면 더욱 그렇습니다.

일부 셸은 초기화 중에 정리하기 위해 모든 외부 열린 파일 설명자를 조심스럽게 닫기 때문에 터미널의 셸에서 열린 것을 볼 수 없습니다. 실수로 파일 설명자를 유출하는 것은 유출된 FD가 실수로 다른 프로그램에 유출될 수 있는 데이터를 전달할 수 있기 때문에 보안 취약점이 될 수 있습니다.

이는 사용자를 변경할 때 특히 위험하므로 추가 항목을 sudo하는 것이 좋습니다.

관련 정보