유닉스 인터넷 소켓 파일인가요?

유닉스 인터넷 소켓 파일인가요?

"모든 것은 파일이다"가 Unix의 주요 개념 중 하나라는 것을 알고 있지만 소켓은 일반적인 파일 시스템 인터페이스와는 달리 커널에서 제공하는 다른 API(예: 소켓, sendto, recv 등)를 사용합니다.

여기서 "모든 것이 파일입니다"는 어떻게 적용됩니까?

답변1

소켓은 다른 API를 사용합니다.

이것은 완전히 정확하지 않습니다. 소켓과 함께 사용할 수 있는 몇 가지 추가 기능이 있지만 일반 기능 read()write()소켓 fd 등을 사용할 수 있습니다.

여기서 "모든 것이 파일입니다"는 어떻게 적용됩니까?

어떤 의미에서는 파일 설명자가 관련되어 있습니다.

"파일"의 정의가 파일 시스템에 저장된 개별 바이트의 시퀀스인 경우 모든 것이 파일은 아닙니다. 그러나 파일 정의가 핸들(정보 전달자, I/O 연결)과 유사하다면 "모든 것이 파일이다"가 더 이해하기 시작합니다. 이러한 것에는 필연적으로 바이트 시퀀스가 ​​포함되지만, 어디에서 오고 가는지는 상황에 따라 다를 수 있습니다.

그러나 이것은 문자 그대로가 아닙니다. ㅏ악마데몬은 파일이 아니라 프로세스입니다.산업용 컴퓨터파일 스타일 엔터티는 다른 프로세스와 관련된 방법을 완화할 가능성이 높습니다.

답변2

"모든 것이 파일이다"라는 말은 과장된 표현일 뿐입니다. 그것예전에는1970년대 소설예전에는UNIX의 주요 특징입니다. 그러나 이것은 단지 마케팅 개념일 뿐이며 UNIX의 실제 기반은 아닙니다. 왜냐하면 분명히 사실이 아니기 때문입니다. 모든 것을 파일로 처리하는 데에는 이점이나 지혜가 없습니다.

CPU는 파일인가요? 귀하의 프로그램은 새로운 명령을 얻기 위해 CPU를 읽습니까()? RAM은 파일인가요? 귀하의 프로그램이 다음 바이트를 읽습니까()?

당시에는 플로피 디스크용 단일 API, 하드 디스크용 API, 테이프용 API, 터미널용 API 등을 제공하는 여러 운영 체제가 있었습니다. IBM 메인프레임 시스템의 하드 드라이브에는 다양한 유형의 파일이 있으며, 믿거나 말거나 각 파일마다 다양한 API가 제공됩니다. 따라서 UNIX의 "파일입니다" 방법은 "stdin/stdout/stderr" 방법과 함께 사용자와 프로그래머에게 매우 우아한 추상화를 제공합니다.

네트워크의 경우 이 특정 추상화는 작동하지 않습니다. 이것은 문제가 되지 않습니다. 단지 운영 체제의 전반적인 우아함과 일관성이 약간 덜하다는 것입니다. 하지만 작동합니다. /dev/myinternetz/www/google/com/tcp/80오늘 시스템 어디에서나 파일이 호출되는 것을 보시 나요 ? 그것을 열고() 쿼리를 작성()한 다음 예쁜 HTML 답변을 읽을() 수 있습니까? 아니요? 이는 "파일임" 추상화가 네트워크 상호작용에 그다지 편리하지 않기 때문입니다. 실제로는 잘 작동하지 않습니다.누출된 추상화의 법칙행동 중.

답변3

소켓은 파일입니다. 소켓에서 read및 를 사용할 수 있습니다 write. 호출하는 것과 동일합니다.recv그리고send그리고 flags=0. 다음 명령을 사용하여 닫습니다.close. 다음 명령을 사용하여 이동할 수 있습니다.dup파일 설명자를 뒤섞어야 한다면 친구들과 함께 작업하세요. 일부 플래그를 설정할 수 있습니다.fcntl, 호출 후 stdio 버퍼링을 사용합니다.fdopen. 목록은 계속됩니다. 매우 중요한 것은 전화를 걸 수 있다는 것입니다.select그리고poll소켓을 포함한 모든 유형의 파일. 따라서 이러한 함수를 사용하면 파일 설명자를 나열하는 것만으로 프로그램이 어떤 수단으로든 입력을 받을 때까지 차단할 수 있습니다.

특정 소켓 유형( recvsend,shutdown등), 마치 장치에 추가 시스템 호출이 있는 것처럼(ioctl).

모든 파일이 있는 것은 아닙니다.이름, 존재하는 디렉토리 중 디렉토리 구조에 항상 존재하는 것은 아닙니다. 생성된 파이프라인pipe(예: 쉘 파이프에서) 및 다음에 의해 생성된 소켓socketpair이름은 없지만 여전히 파일입니다. 소켓 생성자socket도메인에 따라 구문이 달라지는 이름이 있습니다. 이름은 struct sockaddr다음으로 전달됩니다.bind그리고 다른 기능. Unix( AF_UNIX) 소켓의 경우 이름은 다음과 같습니다.struct sockaddr_un는 패밀리이자 문자열입니다. 문자열에 따라 이는 파일 이름( mknod이름이 지정된 소켓은 많은 UNIX 변형에서 생성될 수 있음)일 수도 있고 아닐 수도 있습니다(추상 네임스페이스). IPv4( AF_INET) 소켓의 경우 이름은 다음과 같습니다.struct sockaddr_in, 포트 번호와 IP 주소는 물론 호출이 발생한 protocol주소 도 포함됩니다.socket

답변4

소켓 이라면 stat아이노드 번호와 일반 파일의 다른 특징이 있다는 걸 알 수 있을 테니 파일 시스템에서는 파일로 분류하겠습니다. 예:

# 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를 추출하고 데이터 블록 포인터를 확인하거나 debugfs 'stat' show를 실행하여 이를 확인할 수 있습니다). 블록 수는 0). 따라서 파일 메타데이터(소유자, 그룹, 권한 등)는 있지만 디스크에는 데이터 콘텐츠가 없습니다. 이는 블록 수가 0인 일반 빈 파일( )과 동일합니다. touch /tmp/foo첫 번째 경우에는 inode의 "type" 필드에 "socket"이 표시되고, "socket"이 표시됩니다. 두 번째 경우에는 "일반 파일"이라고 표시됩니다.

인용하다:ext2 인덱스 노드 구조, stat, dumpe2fsdebugfs명령.

관련 정보