@ 기호는 Linux에서 유닉스 도메인 소켓 경로의 시작 부분에서 무엇을 나타 냅니까?


17

실행 netstat --protocol unix하거나 lsof -U일부 유닉스 소켓 경로 앞에 @ 기호가 붙는 것을 볼 수 있습니다 (예 : @ / tmp / dbus-qj8V39Yrpa) . 그런 다음 실행하면 dbus-qj8V39Yrpals -l /tmp 라는 파일이 표시되지 않습니다 .

문제는 앞에 붙은 @ 기호가 무엇을 의미합니까? 두 번째 관련 질문은 파일 시스템에서 실제로 유닉스 소켓 파일 ( @ / tmp / dbus-qj8V39Yrpa )을 어디에서 찾을 수 있습니까?


1
가치가있는 것을 위해,보다 현대적인 ss프로그램은 또한 "@ / tmp / .X11-unix / X0"와 같은 소켓 엔드 포인트를 보여줍니다
Bruce Ediger

답변:


33

@아마에서 열린 소켓을 나타냅니다 abstract namespace파일 시스템에있는 파일에 속하지 않는합니다.

에서 인용 리눅스 프로그래밍 인터페이스 에 의해 마이클 케 리스크 :

57.6 리눅스 추상 소켓 네임 스페이스

소위 추상 네임 스페이스는 파일 시스템에서 해당 이름을 작성하지 않고 UNIX 도메인 소켓을 이름에 바인딩 할 수있는 Linux 고유 기능입니다. 이것은 몇 가지 잠재적 인 이점을 제공합니다.

  • 파일 시스템의 기존 이름과의 충돌 가능성에 대해 걱정할 필요가 없습니다.
  • 소켓 사용이 끝나면 소켓 경로 이름을 연결 해제 할 필요가 없습니다. 소켓이 닫히면 추상 이름이 자동으로 제거됩니다.
  • 소켓의 파일 시스템 경로 이름을 만들 필요가 없습니다. 이것은 chroot 환경에서 또는 파일 시스템에 대한 쓰기 액세스 권한이없는 경우에 유용 할 수 있습니다.

추상 바인딩을 만들려면 sun_path 필드 의 첫 번째 바이트를 null 바이트 (\ 0)로 지정합니다. [...]

null byte이러한 유형의 소켓을 표시하기 위해 행간 을 표시하는 것은 어려울 수 있으므로 선행 @부호 의 이유 일 수 있습니다 .


2
ASCII NUL 문자는 여러 터미널에 ^ @ ([Ctrl] + [@])로 입력되며 다양한 Unix 명령 (예 : GNU cat -a)에 의해 표시 될 때 ^ @로 표시 될 수 있습니다.
Jim Dennis

7

에 따라 man 7 unix

  • abstract : 추상 소켓 주소는 sun_path [0]이 널 바이트 ( \0) 라는 사실로 구별됩니다 . sun_path의 나머지 바이트는 모두 소켓의 "이름"을 정의합니다. 이름의 널 바이트에는 특별한 의미가 없습니다. 이름은 파일 시스템 경로 이름과 연결되지 않습니다. 이 네임 스페이스의 소켓 주소는 sun_path의 나머지 바이트에 의해 제공됩니다. 추상 소켓의 주소가 getsockname (2), getpeername (2) 및 accept (2)에 의해 리턴되면 길이는 sizeof (struct sockaddr_un)이며 sun_path는 추상 이름을 포함합니다. 추상 소켓 네임 스페이스는 이식 불가능한 Linux 확장입니다.

이것들은 '추상적'인 것처럼 보입니다. 파일 시스템에 실제 경로가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.