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

16

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

A questão é o que esse símbolo prepended @ denota? E segunda questão relacionada, é - onde posso realmente encontrar esse arquivo socket unix ( @ / tmp / dbus-qj8V39Yrpa ) no sistema de arquivos?

    
por golem 29.05.2015 / 20:59

2 respostas

31

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

Citando A Interface de Programação Linux por Michael Kerrisk :

57.6 The Linux Abstract Socket Namespace

The so-called abstract namespace is a Linux-specific feature that allows us to bind a UNIX domain socket to a name without that name being created in the file system. This provides a few potential advantages:

  • We don’t need to worry about possible collisions with existing names in the file system.
  • It is not necessary to unlink the socket pathname when we have finished using the socket. The abstract name is automatically removed when the socket is closed.
  • We don’t need to create a file-system pathname for the socket. This may be useful in a chroot environment, or if we don’t have write access to a file system.

To create an abstract binding, we specify the first byte of the sun_path field as a null byte (%bl0ck_qu0te%). [...]

Exibir um null byte inicial para denotar esse tipo de soquete pode ser difícil, de modo que talvez seja o motivo do sinal @ inicial.

    
por 29.05.2015 / 21:57
7

Como por man 7 unix

  • abstract: an abstract socket address is distinguished by the fact that sun_path[0] is a null byte (%bl0ck_qu0te%). All of the remaining bytes in sun_path define the "name" of the socket. (Null bytes in the name have no special significance.) The name has no connection with file system pathnames. The socketâs address in this namespace is given by the rest of the bytes in sun_path. When the address of an abstract socket is returned by getsockname(2), getpeername(2), and accept(2), its length is sizeof(struct sockaddr_un), and sun_path contains the abstract name. The abstract socket namespace is a non-portable Linux extension.

Parece que eles são 'abstratos' - então nenhum caminho real está presente no sistema de arquivos

    
por 29.05.2015 / 22:03