Linux는 '@'을 사용하여 로컬 소켓을 초기화합니다.

Linux는 '@'을 사용하여 로컬 소켓을 초기화합니다.

C에서 로컬 명명 및 네트워크 소켓을 사용한 경험이 있지만 Linux(Fedora 14)에서는 GNOME 시스템 모니터를 사용하여 프로세스에서 사용 중인 로컬 소켓에 경로 init"@/com/ubuntu/upstart". 내가 주목한 한 가지는 이 경로('@' 제외)가 존재하지 않는다는 것입니다. 또한 '@'가 무엇을 의미하는지 전혀 모릅니다. 나는 이것을 다른 곳에서는 본 적이 없습니다.

일부 연구에 따르면 init'upstart' 데몬은 Linux에 도입된 꽤 최근의 것으로, 아마도 다른 오래된 데몬을 대체한 것으로 보입니다. Ubuntu 웹사이트의 하위 도메인에서 호스팅되므로 그런 의미에서 연결이 느껴지지만 '@'은 무엇을 의미합니까? 그리고 존재하지 않는 길이 왜 따라오는 걸까요?

감사해요

답변1

당신이 보고 있는 것은추상 소켓, Linux에 특정한 특별한 종류의 소켓입니다. 에서남자 7 유닉스:

   *  abstract: an abstract socket address is distinguished by the fact that
      sun_path[0] is a null byte ('\0').  The socket's address in this namespace
      is given by the additional bytes in sun_path that are covered by the
      specified length of the address structure.  (Null bytes in the name have no
      special significance.)  The name has no connection with file system
      pathnames.  When the address of an abstract socket is returned by
      getsockname(2), getpeername(2), and accept(2), the returned addrlen is
      greater than sizeof(sa_family_t) (i.e., greater than 2), and the name of
      the socket is contained in the first (addrlen - sizeof(sa_family_t)) bytes
      of sun_path.  The abstract socket namespace is a nonportable Linux
      extension.

이것이 언급되지는 않았지만 추상 소켓 이름은 바인딩() 등에서 사용되는 것처럼 널 바이트 대신 첫 번째 문자 @로 인쇄됩니다.

매뉴얼 페이지에 언급된 대로 @ 또는 널 바이트 뒤의 문자열은 파일 시스템 경로가 아니며 무엇이든 될 수 있습니다. 귀하의 경우에는 조직상의 이유로(다른 추상 소켓과의 충돌을 피하기 위해) 경로로 구성됩니다.

관련 정보