UNIX 세계에서 "모든 것이 파일입니다".
위의 문장이 유명합니다. 내가 실행할 때 echo "hello programmer" >> /dev/tty1
주어진 문자열을 볼 수 있습니다 TeleType 1
....
각각의 파일은 무엇이며 어디에 socket
있습니까? 내 친구가 내 PC에 연결하고 IP가 h.h.h.h
어떻게되는지 각각의 파일에 어떻게 액세스 할 수 있습니까? 가능합니까?
UNIX 세계에서 "모든 것이 파일입니다".
위의 문장이 유명합니다. 내가 실행할 때 echo "hello programmer" >> /dev/tty1
주어진 문자열을 볼 수 있습니다 TeleType 1
....
각각의 파일은 무엇이며 어디에 socket
있습니까? 내 친구가 내 PC에 연결하고 IP가 h.h.h.h
어떻게되는지 각각의 파일에 어떻게 액세스 할 수 있습니까? 가능합니까?
답변:
남자 7 유닉스 :
AF_UNIX (AF_LOCAL이라고도 함) 소켓 제품군은 동일한 시스템의 프로세스간에 효율적으로 통신하는 데 사용됩니다. 일반적으로 UNIX 도메인 소켓은 이름이 지정되지 않거나 파일 시스템 경로 이름 (소켓 유형으로 표시됨)에 바인드 될 수 있습니다. Linux는 파일 시스템과 독립적 인 추상 네임 스페이스도 지원합니다.
즉, 모든 소켓을 파일로 볼 수있는 것은 아닙니다 ( "파일 이름이없는 파일 없음"의미).
그러나 소켓 목록이있는 파일이 있습니다 (예 :) /proc/net/tcp
. "모든 것이 파일"이라는 의미가 아닙니다.
소켓 은 파일입니다. 그러나 모든 파일에 이름이있는 것은 아닙니다. 이름이없는 파일의 예는 다음과 같습니다.
|
쉘 연산자에 의해 생성 된 것과 같은명명되지 않은 파이프 또는 소켓과 같은 파일은 프로세스에 의해 작성되며 해당 프로세스 또는 이후에 작성된 하위 프로세스에서만 액세스 할 수 있습니다. 파이프 나 소켓 (또는 다른 파일)이 열려있는 프로세스는 유닉스 소켓을 통해 다른 프로세스로 전송할 수 있습니다. 파일 디스크립터 전달이라고 합니다.)
파일 시스템 또는 초록에 관계없이 이름이있는 소켓은 해당 이름을 사용하여 열 수 있습니다. 네트워크 소켓은 적절한 연결성을 가진 모든 시스템에서 원격으로 열거 나보다 정확하게 연결할 수 있습니다.
/proc/<pid>/fd/*
그리고 /proc/net/*
흥미로운 일이 될 수 있습니다
각 소켓 당 파일이 무엇이며 어디에 있습니까?
"모든 것"은 과장된 것입니다. 엄격한 정책은 아니며 파일 시스템 액세스는 시스템 호출과 동의어이므로 파일 시스템을 인터페이스에 사용하는 것이 일반적입니다 (즉, 파일 시스템은 실제로 커널과의 인터페이스이므로 모든 종류의 작업에 편리한 형식을 제공합니다) . 다른 운영 체제는 이것을 많이 사용하지 않으므로 구별되는 기능으로 간주됩니다.
Hauke Laging이 언급했듯이 "unix local"소켓 에는 파이프라는 이름의 파일 노드가 있습니다 (참조 man fifo
). 그러나 인터넷 프로토콜 소켓 (네트워크 통신에 사용)은 그렇지 않습니다. 대신, 사용자 공간에서 포트 번호와 연관됩니다. 단일 포트의 서버 소켓은 여러 개의 클라이언트를 각각 개별 소켓으로 연결합니다 (단일 유닉스 로컬 소켓 파일을 서버와 함께 사용할 수 있습니다. 즉, 동일한 파일 주소와 연관된 여러 소켓이있을 수 있음). 코드에서는 실제로 별도의 숫자 파일 디스크립터 를 통해 개별적으로 식별 됩니다.
따라서 모든 소켓 은 파일과 매우 유사하며에 링크가 /proc/[pid]/fd/
있습니다. readlink()
이 inode를 호출 하고 특별한 종류의 파일 이름을 얻을 수 있습니다 lsof
. 마찬가지로를 통해 소켓 설명자에 대한 정보를 얻을 수 있습니다 fstat()
.