나는 주로 궁금하지만 / dev에 네트워크 인터페이스가없는 이유는 무엇입니까? / dev 아래에 노드로 표시되지 않는 다른 종류의 장치가 있습니까?
read()
와 write()
같은 방식으로 파일에서와,하지만 유틸리티 기능 recv()
및 send()
당신을 위해 더 많은 마술을한다.
나는 주로 궁금하지만 / dev에 네트워크 인터페이스가없는 이유는 무엇입니까? / dev 아래에 노드로 표시되지 않는 다른 종류의 장치가 있습니까?
read()
와 write()
같은 방식으로 파일에서와,하지만 유틸리티 기능 recv()
및 send()
당신을 위해 더 많은 마술을한다.
답변:
많은 장치에서 주요 작업은 컴퓨터에서 주변 장치로 바이트를 보내거나 컴퓨터의 주변 장치에서 바이트를받는 것입니다. 이러한 장치는 파이프와 유사하며 문자 장치 로 잘 작동 합니다 . 읽기 및 쓰기가 아닌 작업 (예 : 직렬 회선의 흐름 제어)의 경우 장치는 ioctl 이라는 임시 명령을 제공합니다 .
일부 장치는 일반 파일과 매우 유사합니다. 한정된 바이트 수로 구성되어 있으며 주어진 위치에서 쓴 내용을 나중에 같은 위치에서 읽을 수 있습니다. 이러한 장치를 블록 장치 라고 합니다 .
네트워크 인터페이스는 더 복잡합니다. 읽고 쓰는 것은 바이트가 아니라 패킷입니다. read
and 와 함께 일반적인 인터페이스를 사용하는 것이 여전히 가능하지만 write
어색 할 것입니다. 아마도 각 호출 write
은 패킷을 보내고, 각 호출 read
은 패킷을받을 것입니다 (그리고 버퍼가 너무 작아서 패킷을 맞추기에 적합하지 않은 경우, 패킷이 손실됩니다).
네트워크 인터페이스는 장치 만 제공 할 수 있습니다 ioctl
. 실제로 이것은 일부 유닉스 변형이 수행하지만 Linux는 아닙니다. 이 접근법에는 몇 가지 장점이 있습니다. 예를 들어 Linux에서 네트워크 인터페이스는 udev를 활용할 수 있습니다. 그러나 장점은 제한적이므로 아직 완료되지 않았습니다.
대부분의 네트워크 관련 응용 프로그램은 개별 네트워크 인터페이스에 신경 쓰지 않고 더 높은 수준에서 작동합니다. 예를 들어 웹 브라우저는 TCP 연결을 만들고 웹 서버는 TCP 연결을 수신하려고합니다. 이를 위해 유용한 것은 네트워크 프로토콜과 같은 고급 네트워크 장치를위한 장치입니다.
{ echo $'GET http://www.google.com/ HTTP/1.0\r';
echo $'Host: www.google.com\r';
echo $'\r' >&0; cat; } <>/dev/tcp/www.google.com/80
실제로 ksh 및 bash는 TCP 및 UDP 클라이언트에 이러한 인터페이스를 제공합니다. 그러나 일반적으로 네트워크 응용 프로그램은 파일 액세스 응용 프로그램보다 더 복잡합니다. 대부분의 데이터 교환이 유사한 호출하여 수행하는 동안 read
과 write
의 연결을 설정하는 것은 단지 파일 이름보다 더 많은 정보가 필요합니다. 예를 들어, TCP 연결 수신은 서버 수신 대기시 수행되는 단계와 클라이언트가 접속할 때마다 수행되는 단계의 두 단계로 이루어집니다. 이러한 추가 단계는 파일 API에 적합하지 않으므로 네트워킹에 자체 API가있는 주된 이유입니다.
일반적으로 /dev
Linux 에는 항목이 없지만 다른 유닉스 변형 에는없는 다른 종류의 장치 가 비디오 어댑터입니다. 원칙적으로, 간단한 비디오 어댑터는 프레임 버퍼 장치 로서 노출 될 수 있으며 , 이는 각 픽셀의 색상을 나타내는 블록으로 이루어진 블록 장치 일 수있다. 가속 비디오 어댑터는 응용 프로그램이 명령을 보내는 문자 장치로 표현 될 수 있습니다. 여기서 장치 인터페이스의 단점은 느리다는 것입니다. 표시 응용 프로그램 (실제로 X 서버)은 무엇이든 표시 할 때마다 커널 호출을해야합니다. 대신 X 서버는 비디오 어댑터의 메모리에 직접 쓰기가 더 빠르기 때문에 대부분 발생합니다.
read
/ write
하나; mmap
매핑 된 파일 및 장치 메모리에 직접 액세스하는 데 사용할 수 있습니다 .
/sys/class/net
디렉토리 에서 찾을 수 있습니다 . 그것은 /sys/device/../../
내 다른 가상 머신 (리눅스 커널 3.10) 출력의 다른 파일에 대한 심볼릭 링크 입니다. 그리고 당신은 명령 udevadm info <filename>
을 사용 하여 속성을 살펴볼 수 있습니다
lrwxrwxrwx. 1 root root 0 Apr 3 13:38 ens33 -> ../../devices/pci0000:00/0000:00:11.0/0000:02:01.0/net/ens33
<>
다른 방법으로 사용 하는 경우 마크 업으로 해석됩니다. (단순한 키보드를 사용하는 사용자는 사용자의 의견에 대한 응답으로 이름의 첫 문자를 입력하는 데 어려움이 있으므로 ASCII 문자로 시작하도록 이름을 변경할 수도 있습니다)
TCP / IP 네트워킹을 수행하는 AT & T / Solaris "Transport Level Interface"(TLI) 방식에는 "/ dev / tcp"또는 "/ dev / udp"와 같은 특수 파일이 있습니다. 프로그래머는 해당 프로토콜 파일의 소켓을 얻기 위해 해당 특수 파일을 엽니 다. 그래서 솔라리스에서 소켓을 사용하는 프로그램을 컴파일 할 때 "-lnsl"이 있어야한다고 생각합니다. 그 아래에는 TLI가 있습니다.
/dev/tcp
와 /dev/udp
대부분의 커널은이 비활성화 불구하고.
전통적으로 Linux는 완전히 호환되지는 않았지만 LSB 이외의 모든 Open Group 표준을 따르지 않아도됩니다. 더 많은 UNIX 기능을 Linux로 이식하려는 시도가있었습니다.
Glendix는 Plan9의 / net 가상 파일 시스템 포트를 제공하는 프로젝트 중 하나로서 설명과 마찬가지로 할 수 있습니다.