저는 Linux를 처음 접하고 파일 시스템을 탐색하는 동안 "라는 문구를 자주 접하게 됩니다.모든 것이 파일이다".이 질문에 대한 답이 보입니다.여기그러나 나는 아직도 이 개념을 이해할 수 없다. 답변에 언급된 내용은 바로 "모든 것은 바이트 스트림이다"
모니터/키보드 등이 "바이트 스트림"으로 표시된다는 것이 무엇을 의미하는지 이해하지 못합니다. 누군가 내가 이것을 상상하도록 도와줄 수 있습니까?
답변1
"모든 것이 파일이다"가 슬로건이라고 할 수 있습니다. 원한다면 밈. 이것은 완전히 정확하지 않습니다.
분명히 하드웨어 장치는 hello.txt
ext4 파일 시스템의 실제 파일과 같지 않습니다. 그들 중 다수는 저장 장치와 관련이 없습니다.
하지만 전부는 아니더라도문서, 많은 것들이 가능합니다다음과 같은 액세스적어도 어느 정도는 문서입니다. 즉, 파일 시스템 트리에 이름이 있고 시스템 호출을 사용할 수 있습니다 read()
. write()
후자는 "모든 것이 바이트 스트림이다"라는 느낌을 고려할 때 특히 중요합니다. 이러한 호출은 바이트 스트림에 액세스하기 때문입니다.
동일한 시스템 호출이 일반 파일, 원시 디스크 장치, 터미널, 네트워크 소켓 및 파이프에서 작동하므로 동일한 도구 세트를 사용할 수 있습니다. echo foo
예를 들어 출력이 어디에 연결되어 있든 작동 원리는 동일합니다. 이는 유틸리티 구현을 단순화하고 새로운 목적에 적용하기를 더 쉽게 만듭니다. 셸이나 기타 명령줄 유틸리티는 파이프나 소켓을 통해 SSH 서버에 연결하고 네트워크를 통해 SSH 서버에 액세스하기 위해 특별한 작업을 수행할 필요가 없습니다. (대화형 세션의 경우에도 SSH는 의사 터미널을 생성하므로 로컬 세션과 다르지 않습니다.)
추가적으로, 파일 시스템에 많은 것들이 있을 때, ls
쉘 리디렉션()을 사용하여 그것들을 나열하고 접근할 수 있습니다. 이는 덜 일반적인 시스템 호출을 위해 특수 바이너리를 요구하지 않고 스크립트 안팎에서 특수 파일에 액세스하는 데 유용합니다.cat
echo foo > ...
/proc
/sys
아직 아님모든 것파일 또는 바이트 스트림이므로 read()
및 으로 모든 작업을 수행 할 수는 없습니다 write()
. UDP 소켓은 고정 크기 멀티바이트 데이터그램을 전송하기 때문에 바이트 스트림이 아닙니다. ( 약간 다르게 처리하는 것이 read()
여전히 가능합니다 .) 일부 작업은 여전히 시스템 호출을 통해 수행되어야 하며 ioctl 작업은 장치마다 다릅니다. Linux에서는 네트워크 장치의 파일 시스템에 이름이 없습니다.write()
ioctl()
예를 들어 참조하십시오.
답변2
UNIX/Linux 시스템의 모든 것은 일종의 입력 또는 출력 장치로 시각화될 수 있습니다.
디스크는 두 가지 모두를 제공합니다. 즉, 디스크에 바이트 스트림을 쓰거나 디스크에서 바이트 스트림을 읽습니다. 키보드는 입력 장치입니다. 키보드에서 바이트 스트림을 읽습니다.
이 바이트 스트림의 해석은 현재 키보드를 사용하는 프로그램(셸, 사용자 프로그램, 시스템 프로그램 또는 다른 프로그램)에 따라 다릅니다. 터미널은 단순히 STDOUT 또는 STDERR에 기록된 바이트 스트림입니다.
그래픽 콘솔에 관해 이야기할 때 비유가 다소 무너지지만 모든 터미널 창에서 적용됩니다. 터미널 창은 단순히 쉘/프로그램이 바이트를 보낼 때까지 기다리고 해당 바이트를 텍스트나 다른 ASCII 문자로 사용자에게 표시합니다.
이 답변에 대한 의견에서 지적했듯이 시스템에 더 깊이 들어가면서 비유가 더욱 세분화됩니다. "모든 것이 파일이다"라는 원래 문구와 "모든 것이 바이트 스트림이다"라는 관련 문구는 시스템을 처음 접하거나 경험이 부족한 사람들이 시스템을 쉽게 볼 수 있도록 만들어낸 것 같습니다. 경험을 쌓고 Linux에 더 많이 참여하게 되면 이러한 단순화가 때로는 올바르지 않다는 것을 깨닫게 될 것입니다. 그러나 환경에 이제 막 익숙해진 사람에게는 여전히 가치가 있을 수 있습니다.