"Everything is a file"은 Unix의 주요 개념 중 하나이지만 소켓은 일반적인 파일 시스템 인터페이스가 아니라 커널이 제공하는 다른 API (소켓, sendto, recv 등)를 사용합니다.
이 "모든 것이 파일입니다"는 어떻게 적용됩니까?
"Everything is a file"은 Unix의 주요 개념 중 하나이지만 소켓은 일반적인 파일 시스템 인터페이스가 아니라 커널이 제공하는 다른 API (소켓, sendto, recv 등)를 사용합니다.
이 "모든 것이 파일입니다"는 어떻게 적용됩니까?
답변:
소켓은 다른 API를 사용합니다
그것은 사실이 아닙니다. 소켓과 함께 사용할 수있는 몇 가지 추가 기능이 있지만 일반 read()
및 write()
소켓 fd 와 같은 기능을 사용할 수 있습니다 .
이 "모든 것이 파일입니다"는 어떻게 적용됩니까?
파일 디스크립터가 관련되어 있다는 의미에서.
"file"에 대한 정의가 파일 시스템에 저장된 이산 바이트 시퀀스 인 경우 모든 것이 파일 인 것은 아닙니다. 그러나 파일의 정의가 정보의 도관, 즉 I / O 연결과 같은보다 다루기 쉬운 경우 "모든 것이 파일입니다"라는 것이 더 의미가 있습니다. 이러한 작업은 불가피하게 바이트 시퀀스와 관련이 있지만 어디에서 왔는지 또는가는 위치는 상황에 따라 다를 수 있습니다.
그러나 실제로 문자 그대로 의도 된 것은 아닙니다. 데몬은 데몬은 과정, 파일 아니다; 그러나 IPC 를 수행하는 경우 다른 프로세스와 관련된 방법이 파일 스타일 엔티티에 의해 완화 될 수 있습니다.
"모든 것이 파일입니다"는 과장된 표현 일뿐입니다. 그것은 이었다 1970 년대 소설과는 있었다 UNIX의 주요 구별되는 특성. 그러나 실제로는 사실이 아니기 때문에 마케팅 개념 일 뿐이며 실제 UNIX 기반이 아닙니다. 모든 것을 파일로 취급하는 것은 유익하거나 합리적이지 않습니다.
CPU는 파일입니까? 새로운 명령어를 얻기 위해 프로그램이 CPU를 읽습니까 ()? RAM은 파일입니까? 프로그램이 다음 바이트를 읽습니까?
그 당시에는 플로피 디스크 용 API와 하드 디스크 용 API, 마그네틱 테이프 용 API, 터미널마다 다른 API 등을 제공하는 OS가있었습니다. IBM 메인 프레임 시스템에는 하드 디스크에 서로 다른 유형의 파일이 있으며 각 파일마다 다른 API를 제공합니다. 따라서 "stdin / stdout / stderr"접근 방식과 함께 UNIX "파일"접근 방식은 사용자와 프로그래머 모두에게 매우 우아한 추상화를 가져 왔습니다.
네트워크를 통해이 특정 추상화가 제대로 작동하지 않았습니다. 그리고 OS의 전반적인 우아함과 일관성에 약간의 영향을 미치지 않습니다. 그러나 작동합니다. /dev/myinternetz/www/google/com/tcp/80
오늘날 시스템 어디에서나 파일이 표시 됩니까? 당신은 그것을 열고 (), 쿼리를 작성하고, 멋진 HTML로 답을 읽을 수 있습니까? 아니? 이것은 "파일입니다"추상화가 네트워크에서 상호 작용하는 데별로 유용하지 않았기 때문입니다. 실제로는 잘 작동하지 않습니다. 새는 추상화의 법칙 .
/dev/tcp/www.google.com/80
. 실제 파일은 아니지만 bash는 그냥 가짜입니다.
/dev/mem
있거나 /dev/kmem
원한다면 가능하다고 생각합니다 .
소켓은 파일입니다. 당신은 사용할 수 있습니다 read
및 write
소켓에 : 그들은 호출하는 것과있어 recv
및 send
과 flags=0
. 로 닫으십시오 close
. dup
파일 디스크립터를 섞어 야하는 경우 친구 와 함께 이동할 수 있습니다 . 로 일부 플래그를 설정하고 fcntl
호출 후 stdio 버퍼링을 사용할 수 있습니다 fdopen
. 목록은 계속됩니다. 매우 중요한 것은 소켓을 포함한 모든 유형의 파일을 호출 select
하고 호출 할 수 poll
있으므로 이러한 함수를 사용하면 파일 디스크립터를 나열하여 모든 수단을 통해 입력을받을 때까지 프로그램이 차단 될 수 있습니다.
일부 소켓 타입 (여분의 시스템 호출이 있습니다 recv
와 send
, shutdown
장치에 대한 별도의 시스템 호출 (이 같은 등) ioctl
).
모든 파일에 이름 이있는 것은 아니며 , 파일 이름이 항상 디렉토리 구조에있는 것은 아닙니다. pipe
쉘 파이프 라인에서 생성 한 파이프와 소켓 socketpair
은 이름이 없지만 여전히 파일입니다. 소켓 socket
은 구문이 도메인에 따라 다른 이름으로 생성됩니다 . 이 이름은 struct sockaddr
에 bind
및 기타 함수 로 전달됩니다 . 유닉스 ( AF_UNIX
) 소켓의 경우, 이름은입니다 struct sockaddr_un
. 문자열에 따라 파일 이름 (소켓은 mknod
여러 유닉스 변형 으로 만들 수 있음 )이거나 아닌 것 (추상 네임 스페이스) 일 수 있습니다. 는 IPv4 (위해 AF_INET
) 소켓의 이름은이다 struct sockaddr_in
포트 번호와 IP 주소, 플러스 포함 protocol
으로부터 socket
전화를.
stat
소켓 이라면 소켓에 inode 번호와 일반 파일의 다른 특성이 있음을 알 수 있으므로 파일 시스템의 파일로 분류합니다. 예:
# file live
live: socket
# stat live
File: `live'
Size: 0 Blocks: 0 IO Block: 4096 socket
Device: fc03h/64515d Inode: 198817 Links: 1
Access: (0660/srw-rw----) Uid: (23129/ icinga) Gid: (23130/icinga-cmd)
Access: 2014-11-07 09:27:59.000000000 -0800
Modify: 2014-11-05 09:27:03.000000000 -0800
Change: 2014-11-05 09:27:03.000000000 -0800
11/17. Linux에 대한 추가 정보 (ext3) : 소켓에는 inode (디스크의 256 바이트 블록)가 있지만 데이터 블록이 없습니다 (inode를 추출하고 데이터 블록 포인터를 검사하여이를 확인할 수 있음) Blockcount 0을 표시하는 debugfs 'stat'실행). 따라서 파일 메타 데이터 (소유자, 그룹, 권한 등)는 있지만 디스크에는 데이터 내용이 없습니다. 이는 touch /tmp/foo
블록 수가 0 인 일반 빈 파일 ( ) 과 동일 합니다. 첫 번째 경우 inode의 "type"필드에는 "socket"이 표시됩니다. 두 번째 경우에는 "일반 파일"이 표시됩니다.
참고 문헌 : ext2 inode 구조 ; stat
, dumpe2fs
및 debugfs
명령.
file
하거나 실행 stat
하는 것이 파일이된다고 말하고 싶습니다 .