O que o símbolo @ indica no início de um caminho de soquete de domínio unix no Linux?

17

Quando executo netstat --protocol unixou lsof -Uvejo que alguns caminhos de soquete unix são anexados com o símbolo @, por exemplo, @ / tmp / dbus-qj8V39Yrpa . Então, quando eu executo ls -l /tmp, não vejo o arquivo chamado dbus-qj8V39Yrpa lá.

A questão é o que esse símbolo @ anexado? E a segunda pergunta relacionada é: onde posso encontrar esse arquivo de soquete unix ( @ / tmp / dbus-qj8V39Yrpa ) no sistema de arquivos?

golem
fonte
1
Pelo que vale a pena, o ssprograma mais moderno também mostra pontos de extremidade de soquete como "@ / tmp / .X11-unix / X0"
Bruce Ediger

Respostas:

33

O @provavelmente indica um soquete mantido em um abstract namespaceque não pertence a um arquivo no sistema de arquivos.

Citando a Interface de Programação Linux de Michael Kerrisk :

57.6 O espaço para nome do Linux Abstract Socket

O chamado namespace abstrato é um recurso específico do Linux que nos permite vincular um soquete de domínio UNIX a um nome sem que esse nome seja criado no sistema de arquivos. Isso fornece algumas vantagens em potencial:

  • Não precisamos nos preocupar com possíveis colisões com nomes existentes no sistema de arquivos.
  • Não é necessário desvincular o nome do caminho do soquete quando terminarmos de usá-lo. O nome do resumo é removido automaticamente quando o soquete é fechado.
  • Não precisamos criar um nome de caminho do sistema de arquivos para o soquete. Isso pode ser útil em um ambiente chroot ou se não tivermos acesso de gravação a um sistema de arquivos.

Para criar uma ligação abstrata, especificamos o primeiro byte do campo sun_path como um byte nulo (\ 0). [...]

Exibir uma indicação null bytepara indicar esse tipo de soquete pode ser difícil, e talvez esse seja o motivo do @sinal principal .

FloHimself
fonte
2
Vale ressaltar que o caractere ASCII NUL é inserido em muitos terminais como ^ @ ([Ctrl] + [@]) e pode aparecer como ^ @ quando exibido por vários comandos do Unix (como GNU cat -a).
21419 Jim
7

Conforme man 7 unix

  • abstract: um endereço de soquete abstrato é diferenciado pelo fato de que sun_path [0] seja um byte nulo ( \0). Todos os bytes restantes em sun_path definem o "nome" do soquete. (Bytes nulos no nome não têm significado especial.) O nome não tem conexão com os nomes de caminho do sistema de arquivos. O endereço do soquete nesse espaço para nome é fornecido pelo restante dos bytes em sun_path. Quando o endereço de um soquete abstrato é retornado por getsockname (2), getpeername (2) e accept (2), seu comprimento é sizeof (struct sockaddr_un) e sun_path contém o nome do resumo. O espaço para nome do soquete abstrato é uma extensão Linux não portátil.

Parece que estes são 'abstratos' - portanto, nenhum caminho real está presente no sistema de arquivos

VenkatC
fonte