각 소켓마다 파일이 있습니까?


21

UNIX 세계에서 "모든 것이 파일입니다".

위의 문장이 유명합니다. 내가 실행할 때 echo "hello programmer" >> /dev/tty1주어진 문자열을 볼 수 있습니다 TeleType 1 ....

각각의 파일은 무엇이며 어디에 socket있습니까? 내 친구가 내 PC에 연결하고 IP가 h.h.h.h어떻게되는지 각각의 파일에 어떻게 액세스 할 수 있습니까? 가능합니까?


3
소켓 API는 원래 BSD 에서 왔기 때문에 실제로 "Unix 정책"에서 벗어난 것 입니다. Bell Labs의 Plan 9는 항상 "Unix보다 더 많은 Unix"입니다. 네트워크 및 그래픽 API도 파일입니다.
ntoskrnl

소켓과 프로세스는 Plan 9 백서에서 상당 부분 언급되어 있으며, 주로 UNIX 모델이 어디에서 잘못되었는지에 대해 이야기합니다.
strugee

답변:


9

남자 7 유닉스 :

AF_UNIX (AF_LOCAL이라고도 함) 소켓 제품군은 동일한 시스템의 프로세스간에 효율적으로 통신하는 데 사용됩니다. 일반적으로 UNIX 도메인 소켓은 이름이 지정되지 않거나 파일 시스템 경로 이름 (소켓 유형으로 표시됨)에 바인드 될 수 있습니다. Linux는 파일 시스템과 독립적 인 추상 네임 스페이스도 지원합니다.

즉, 모든 소켓을 파일로 볼 수있는 것은 아닙니다 ( "파일 이름이없는 파일 없음"의미).

그러나 소켓 목록이있는 파일이 있습니다 (예 :) /proc/net/tcp. "모든 것이 파일"이라는 의미가 아닙니다.


38

소켓 파일입니다. 그러나 모든 파일에 이름이있는 것은 아닙니다. 이름이없는 파일의 예는 다음과 같습니다.

  • 이전에 이름이 있었지만 이제는 파일을 삭제했지만 여전히 프로그램에 의해 열린 파일입니다.
  • 명명되지 않은 파이프|쉘 연산자에 의해 생성 된 것과 같은
  • 대부분의 소켓 : 인터넷 소켓 또는 유닉스 소켓 파일 시스템 네임 스페이스에없는 (추상 네임 스페이스에 있거나 이름이 없을 수 있음).

명명되지 않은 파이프 또는 소켓과 같은 파일은 프로세스에 의해 작성되며 해당 프로세스 또는 이후에 작성된 하위 프로세스에서만 액세스 할 수 있습니다. 파이프 나 소켓 (또는 다른 파일)이 열려있는 프로세스는 유닉스 소켓을 통해 다른 프로세스로 전송할 수 있습니다. 파일 디스크립터 전달이라고 합니다.)

파일 시스템 또는 초록에 관계없이 이름이있는 소켓은 해당 이름을 사용하여 열 수 있습니다. 네트워크 소켓은 적절한 연결성을 가진 모든 시스템에서 원격으로 열거 나보다 정확하게 연결할 수 있습니다.


이것이 정답입니다.
jforberg

4
/proc/<pid>/fd/*그리고 /proc/net/*흥미로운 일이 될 수 있습니다
n611x007

이 답변을 수락하십시오. IMHO가 훨씬 더 정확합니다.
user1202136

13

각 소켓 당 파일이 무엇이며 어디에 있습니까?

"모든 것"은 과장된 것입니다. 엄격한 정책은 아니며 파일 시스템 액세스는 시스템 호출과 동의어이므로 파일 시스템을 인터페이스에 사용하는 것이 일반적입니다 (즉, 파일 시스템은 실제로 커널과의 인터페이스이므로 모든 종류의 작업에 편리한 형식을 제공합니다) . 다른 운영 체제는 이것을 많이 사용하지 않으므로 구별되는 기능으로 간주됩니다.

Hauke ​​Laging이 언급했듯이 "unix local"소켓 에는 파이프라는 이름의 파일 노드가 있습니다 (참조 man fifo). 그러나 인터넷 프로토콜 소켓 (네트워크 통신에 사용)은 그렇지 않습니다. 대신, 사용자 공간에서 포트 번호와 연관됩니다. 단일 포트의 서버 소켓은 여러 개의 클라이언트를 각각 개별 소켓으로 연결합니다 (단일 유닉스 로컬 소켓 파일을 서버와 함께 사용할 수 있습니다. 즉, 동일한 파일 주소와 연관된 여러 소켓이있을 수 있음). 코드에서는 실제로 별도의 숫자 파일 디스크립터 를 통해 개별적으로 식별 됩니다.

따라서 모든 소켓 파일과 매우 유사하며에 링크가 /proc/[pid]/fd/있습니다. readlink()이 inode를 호출 하고 특별한 종류의 파일 이름을 얻을 수 있습니다 lsof. 마찬가지로를 통해 소켓 설명자에 대한 정보를 얻을 수 있습니다 fstat().


"아이 노드로 사용자 공간에서 식별"을 의미합니까? 모든 소켓에 포트 번호가있는 것은 아니며 동일한 포트 번호에 대해 여러 개의 소켓이있을 수 있습니다 (그렇지만 의미가 없습니다).
Hauke ​​Laging

@HaukeLaging : 좋은 지적입니다. 나는 두 번째 단락으로 시작하여 이것을 명확히하기 위해 편집했습니다.
goldilocks
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.