Provided by:
manpages-pt_20040726-2_all 
NOME
unix, PF_UNIX, AF_UNIX, PF_LOCAL, AF_LOCAL - Sockets para comunicação
local interprocessos.
SINOPSE
#include <sys/socket.h>
#include <sys/un.h>
unix_socket = socket(PF_UNIX, type, 0);
error = socketpair(PF_UNIX, type, 0, int *sv);
DESCRIÇÃO
A família de sockets PF_UNIX (também conhecida como PF_LOCAL ) é usada
para comunicação eficiente entre processos na mesma máquina. Sockets
Unix podem ser anônimos (criados pelo socketpair(2)) ou associados com
um arquivo do tipo do socket. O Linux também suporta um espaço de
nomes abstrato, que é independente do sistema de arquivos.
Tipos válidos são SOCK_STREAM para um socket orientado a stream, e
SOCK_DGRAM para um socket orientado a datagrama que preserva os limites
das mensagens. Os sockets Unix também são confiáveis e não reordenam
os datagramas.
Os sockets Unix suportam a passagem para outros processos de
descritores de arquivos ou credenciais de processos, como dados
ancilares para datagramas.
FORMATO DE ENDEREÇO
Um endereço Unix é definido como um nome de arquivo no sistema de
arquivos ou como uma string única no espaço de nomes abstrato. Os
sockets criados pelo socketpair(2) são anônimos. Para sockets não
anônimos, o endereço-alvo pode ser setado usando-se connect(2). O
endereço local pode ser setado usando-se bind(2). Quando um socket é
conectado e ainda não tem um endereço local, um endereço único será
gerado automaticamente no espaço de nomes abstrato.
#define UNIX_PATH_MAX 108
struct sockaddr_un {
sa_family_t sun_family; /* AF_UNIX */
char sun_path[UNIX_PATH_MAX]; /* caminho de diretório */
};
sun_family sempre contém AF_UNIX. sun_path contém o caminho de
diretório, terminado em zero, do socket no sistema de arquivos. Se
sun_path começa com um byte zero, ele se refere ao espaço de nomes
abstrato mantido pelo módulo do protocolo Unix. O endereço do socket
neste espaço de nomes é dado pelo restante dos bytes em sun_path. Note
que os nomes no espaço de nomes abstrato não são terminados em zero.
OPÇÕES DE SOCKET
Por razões históricas, essas opções de socket são especificadas com um
tipo SOL_SOCKET mesmo sendo específicos do PF_UNIX. Eles podem ser
selecionados com setsockopt(2) e lidos com getsockopt(2) especificando-
se SOL_SOCKET como a família de socket.
SO_PASSCRED habilita o recebimento das credenciais da mensagem ancilar
de processo de envio. Quando essa opção é setada e o socket ainda não
está conectado, um nome único será gerado automaticamente no espaço de
nomes abstrato. Espera um flag booleano inteiro.
MENSAGENS ANCILARES
Por razões históricas, esses tipos de mensagens ancilares são
especificados com um tipo SOL_SOCKET mesmo sendo específicos do
PF_UNIX. Para enviá-los, setar o campo cmsg_level da estrutura cmsghdr
com SOL_SOCKET, e o campo cmsg_type com o tipo. Para mais informações,
veja cmsg(3).
SCM_RIGHTS
Envia ou recebe um conjunto de descritores de arquivo de outro
processo. A porção de dados contém uma matriz de inteiros com
os descritores de arquivos. Os descritores de arquivo passados
se comportam como se tivessem sido criados com dup(2).
SCM_CREDENTIALS
Envia ou recebe credenciais do unix. Isto pode ser usado para
autenticação. As credenciais são passadas como uma mensagem
ancilar de struct ucred
struct ucred {
pid_t pid; /* "process id" do processo de envio */
uid_t uid; /* "user id" do processo de envio */
gid_t gid; /* "group id" do processo de envio */
};
As credenciais que o remetente especifica são verificadas pelo kernel.
Um processo com id de usuário efetivo igual a 0 tem permissão para
especificar valores que não casam com o seu próprio valor. O remetente
precisa especificar seu próprio id de processo (a menos que ele tenha
CAP_SYS_ADMIN), seu id de usuário, id de usuário efetivo ou setar o id
de usuário (a menos que ele tenha CAP_SETUID), e seu id de grupo, id de
grupo efetivo ou setar o id do grupo (a menos que ele tenha
CAP_SETGID). Para receber uma mensagem de struct ucred a opção
SO_PASSCRED precisa estar habilitada no socket.
VERSÕES
SCM_CREDENTIALS e o espaço de nomes abstrato foram introduzidos com o
Linux 2.2 e não deve ser usados em programas portáveis.
NOTAS
Na implementação Linux, os sockets que são visíveis no sistema de
arquivos respeitam as permissões do diretório onde eles estão. Seus
proprietários, grupo e permissões podem ser alterados. A criação de um
novo socket falhará se o processo não tiver permissão de escrita e
busca (execução) no diretório no qual o socket é criado. A conexão com
o objeto do socket requer permissão de leitura/escrita. Este
comportamento difere de muitos sistemas derivados do BSD, que ignoram
permissões para sockets Unix. Programas portáveis não devem confiar
nessa implementação, por segurança.
Ligar-se a um socket com um nome de arquivo cria um socket no sistema
de arquivos que precisa ser deletado por que chama quando ele não for
mais necessário (usando-se unlink(2)). Aplica-se a semântica "fecha
para trás" normal do Unix; o socket pode ser desligado a qualquer
momento, e será finalmente removido do sistema de arquivos quando a
última referência a ele for encerrada.
Para enviar descritores de arquivos ou credenciais, você precisa
enviar/ler pelo menos um byte.
ERROS
ENOMEM Sem memória.
ECONNREFUSED
connect(2) foi chamado com um objeto de socket que não está
escutando. Isto pode acontecer quando um socket remoto não
existe, ou o nome de arquivo não é um socket.
EINVAL Um argumento inválido foi passado. Uma causa comum é a perda de
configuração do AF_UNIX no campo sun_type do endereço passado,
ou o socket está em um estado inválido para a operação aplicada.
EOPNOTSUPP
Uma operação de stream foi chamada em um socket não orientado a
stream, ou tentou usar uma opção de dados fora de banda.
EPROTONOSUPPORT
O protocolo passado não é PF_UNIX.
ESOCKTNOSUPPORT
Tipo de socket desconhecido.
EPROTOTYPE
O socket remoto não encontra o tipo de socket local (SOCK_DGRAM
vs. SOCK_STREAM).
EADDRINUSE
O endereço local selecionado já foi pego, ou o objeto de socket
do sistema de arquivo já existe.
EISCONN
connect(2) foi chamado em um socket já conectado, ou um
endereço-alvo foi especificado em um socket conectado.
ENOTCONN
A operação de socket precisa de um endereço-alvo, mas o socket
não está conectado.
ECONNRESET
O socket remoto foi encerrado inesperadamente.
EPIPE O socket remoto foi encerrado em um socket de stream. Se
habilitado, um SIGPIPE é enviado também. Isto pode ser evitado
pela passagem da flag MSG_NOSIGNAL para sendmsg(2) ou para
recvmsg(2).
EFAULT O endereço de memória do usuário não era válida.
EPERM O remetente passou credenciais inválidas na struct ucred.
Outros erros podem ser gerados pela camada genérica de sockets ou pelo
sistema de arquivos, enquanto geram um objeto de socket do sistema de
arquivos. Veja as páginas de manual apropriadas para maiores
informações.
VEJA TAMBÉM
recvmsg(2), sendmsg(2), socket(2), socketpair(2), cmsg(3), socket(7)
CRÉDITOS
Esta página de manual foi escrita por Andi Kleen.
TRADUZIDO POR LDP-BR em 21/08/2000.
Rubens de Jesus Nogueira <darkseid99@usa.net> (tradução) Xxxxxxx
Xxxxxxxxx Xxxxxxxx <xxxxxxxxx@xxxxxxx> (revisão)