예를 들어, @ 기호가 앞에 오는 일부 UNIX 소켓 경로를 실행 netstat --protocol unix
하거나 볼 때,lsof -U
@/tmp/dbus-qj8V39Yrpa. 그러다가 달릴 때 ls -l /tmp
이름이 보이지 않아요dbus-qj8V39Yrpa거기.
문제는 앞에 있는 @ 기호가 무엇을 의미하는지 입니다. 두 번째 관련 질문은 - 유닉스 소켓 파일을 어디서 찾을 수 있습니까?@/tmp/dbus-qj8V39Yrpa) 파일 시스템에 있습니까?
답변1
파일 시스템의 파일에 속하지 않는 소켓을 나타낼 수 있습니다 @
.abstract namespace
에서 인용리눅스 프로그래밍 인터페이스통과마이클 크릭:
57.6 리눅스 추상 소켓 네임스페이스
소위 추상 네임스페이스는 파일 시스템에 이름을 생성하지 않고도 UNIX 도메인 소켓을 이름에 바인딩할 수 있는 Linux 특정 기능입니다. 이는 몇 가지 잠재적인 이점을 제공합니다.
- 파일 시스템에 있는 기존 이름과의 충돌 가능성에 대해 걱정할 필요가 없습니다.
- 사용이 끝나면 소켓 경로 이름을 연결 해제할 필요가 없습니다. 소켓이 닫히면 추상 이름이 자동으로 제거됩니다.
- 소켓에 대한 파일 시스템 경로 이름을 만들 필요가 없습니다. 이는 chroot 환경이나 파일 시스템에 대한 쓰기 권한이 없는 경우 유용할 수 있습니다.
추상 바인딩을 생성하려면 첫 번째 바이트를 지정합니다. 태양 경로필드가 널 바이트(\0)입니다. [...]
이러한 유형의 소켓을 나타내기 위해 선행을 표시하는 것이 어려울 수 있으므로 null byte
이것이 선행 표기법의 이유일 수 있습니다 @
.
답변2
~에 따르면man 7 unix
- 개요: 추상 소켓 주소의 차이점은 sun_path[0]가 널 바이트(
\0
)라는 것입니다. sun_path의 나머지 모든 바이트는 소켓의 "이름"을 정의합니다. (이름의 널 바이트는 특별한 의미가 없습니다.) 이름은 파일 시스템 경로 이름과 관련이 없습니다. 이 네임스페이스의 소켓 주소는 sun_path의 나머지 바이트로 제공됩니다. getsockname(2), getpeername(2) 및 accept(2)가 길이가 sizeof(struct sockaddr_un)인 추상 소켓의 주소를 반환할 때 sun_path에는 추상 이름이 포함됩니다. 추상 소켓 네임스페이스는 이식 불가능한 Linux 확장입니다.
이것은 "추상적"인 것처럼 보입니다. 따라서 파일 시스템에 실제 경로가 존재하지 않습니다.