.\" This man page is Copyright (C) 1999 Andi Kleen . .\" Permission is granted to distribute possibly modified copies .\" of this page provided the header is included verbatim, .\" and in case of nontrivial modification author and date .\" of the modification is added to the header. .\" $Id: unix.7,v 1.1 2000/10/20 13:05:12 ricardo Exp $ .TH UNIX 7 "07/05/1999" "Página do Manual Linux" "Manual do Programador Linux" .SH NOME unix, PF_UNIX, AF_UNIX, PF_LOCAL, AF_LOCAL \- Sockets para comunicação local interprocessos. .SH SINOPSE .B #include .br .B #include .IB unix_socket " = socket(PF_UNIX, type, 0);" .br .IB error " = socketpair(PF_UNIX, type, 0, int *" sv ");" .SH DESCRIÇÃO A família de sockets .B PF_UNIX (também conhecida como .B PF_LOCAL ) é usada para comunicação eficiente entre processos na mesma máquina. Sockets Unix podem ser anônimos (criados pelo .BR 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 .B SOCK_STREAM para um socket orientado a stream, e .B 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. .SH 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 .BR socketpair (2) são anônimos. Para sockets não anônimos, o endereço-alvo pode ser setado usando-se .BR connect (2). O endereço local pode ser setado usando-se .BR 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. .RS .nf #define UNIX_PATH_MAX 108 .ta 4n 17n 42n struct sockaddr_un { sa_family_t sun_family; /* AF_UNIX */ char sun_path[UNIX_PATH_MAX]; /* caminho de diretório */ }; .fi .RE .B sun_family sempre contém .BR AF_UNIX . .B sun_path contém o caminho de diretório, terminado em zero, do socket no sistema de arquivos. Se .B 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 .BR sun_path . Note que os nomes no espaço de nomes abstrato não são terminados em zero. .SH 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 .BR setsockopt (2) e lidos com .BR getsockopt (2) especificando-se SOL_SOCKET como a família de socket. .B 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. .SH 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 .B cmsg_level da estrutura .B cmsghdr com SOL_SOCKET, e o campo .B cmsg_type com o tipo. Para mais informações, veja .BR cmsg (3). .TP .B 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 .BR dup (2). .TP .B 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 .B struct ucred . .RS .nf .ta 4n 11n 17n 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 */ }; .fi .RE 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 .BR 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 .BR CAP_SETUID ), e seu id de grupo, id de grupo efetivo ou setar o id do grupo (a menos que ele tenha .BR CAP_SETGID ). Para receber uma mensagem de .B struct ucred a opção .B SO_PASSCRED precisa estar habilitada no socket. .SH VERSÕES .B 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. .SH 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 .BR 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. .SH ERROS .TP .B ENOMEM Sem memória. .TP .B ECONNREFUSED .BR 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. .TP .B 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. .TP .B 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. .TP .B EPROTONOSUPPORT O protocolo passado não é PF_UNIX. .TP .B ESOCKTNOSUPPORT Tipo de socket desconhecido. .TP .B EPROTOTYPE O socket remoto não encontra o tipo de socket local (SOCK_DGRAM vs. SOCK_STREAM). .TP .B EADDRINUSE O endereço local selecionado já foi pego, ou o objeto de socket do sistema de arquivo já existe. .TP .B EISCONN .BR connect (2) foi chamado em um socket já conectado, ou um endereço-alvo foi especificado em um socket conectado. .TP .B ENOTCONN A operação de socket precisa de um endereço-alvo, mas o socket não está conectado. .TP .B ECONNRESET O socket remoto foi encerrado inesperadamente. .TP .B EPIPE O socket remoto foi encerrado em um socket de stream. Se habilitado, um .B SIGPIPE é enviado também. Isto pode ser evitado pela passagem da flag .B MSG_NOSIGNAL para .BR sendmsg (2) ou para .BR recvmsg (2). .TP .B EFAULT O endereço de memória do usuário não era válida. .TP .B EPERM O remetente passou credenciais inválidas na .BR "struct ucred" . .PP 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. .SH VEJA TAMBÉM .BR recvmsg (2), .BR sendmsg (2), .BR socket (2), .BR socketpair (2), .BR cmsg (3), .BR socket (7) .SH CRÉDITOS Esta página de manual foi escrita por Andi Kleen. .SH TRADUZIDO POR LDP-BR em 21/08/2000. \&\fR\&\f(CWRubens de Jesus Nogueira (tradução)\fR \&\fR\&\f(CWXxxxxxx Xxxxxxxxx Xxxxxxxx (revisão)\fR