Provided by: manpages-fr_3.57d1p1-1_all bug

NOM

       unix - Sockets pour communications locales entre processus

SYNOPSIS

       #include <sys/socket.h>
       #include <sys/un.h>

       unix_socket = socket(AF_UNIX, type, 0);
       error = socketpair(AF_UNIX, type, 0, int *sv);

DESCRIPTION

       La  famille  de  socket AF_UNIX (aussi connue sous le nom AF_LOCAL) sert à communiquer efficacement entre
       processus sur la même machine. Traditionnellement, les sockets  de  domaine  UNIX  peuvent  ne  pas  être
       nommées  ou  bien  être  liées à un chemin d'accès, lequel sera marqué comme étant de type socket, sur un
       système de fichiers. Linux gère également un espace de noms abstrait, indépendant du système de fichiers.

       Les types valables sont : SOCK_STREAM, pour une socket orientée  flux  et  SOCK_DGRAM,  pour  une  socket
       orientée  datagramme,  préservant  les  limites  entre messages (comme sur la plupart des implémentations
       UNIX, les  sockets  datagramme  de  domaine  UNIX  sont  toujours  fiables  et  ne  réordonnent  pas  les
       datagrammes) ; et (depuis Linux 2.6.4) SOCK_SEQPACKET, pour une socket orientée connexion, préservant les
       limites entre messages et délivrant les messages dans l'ordre où ils ont été envoyés.

       Les sockets  de  domaine  UNIX  prennent  en  charge  la  transmission  de  descripteurs  de  fichier  ou
       d'identificateurs d'un processus à l'autre en utilisant des données annexes.

   Format d'adresse
       Une adresse de socket de domaine UNIX est représentée dans la structure suivante :

           #define UNIX_PATH_MAX    108

           struct sockaddr_un {
               sa_family_t sun_family;               /* AF_UNIX */
               char        sun_path[UNIX_PATH_MAX];  /* chemin accès */
           };

       sun_family contient toujours la valeur AF_UNIX.

       On considère trois types d'adresse pour cette structure :

       *  chemin  d'accès :  une  socket  de domaine UNIX peut être liée, avec bind(2), à un système de fichiers
          dont le chemin d'accès est une chaîne de caractères terminée par l’octet NULL. Lorsque l'adresse de la
          socket est obtenue avec getsockname(2), getpeername(2) ou accept(2), sa longueur vaut

              offsetof(struct sockaddr_un, sun_path) + strlen(sun_path) + 1

          et  sun_path  contient  une  chaîne  de  caractères, terminée par un octet nul, représentant le chemin
          d'accès.

       *  sans nom : une socket orientée flux qui n'a pu être liée à un chemin d'accès avec bind(2) n'a  pas  de
          nom.  De  la  même  façon,  les  deux  sockets  crées  avec socketpair(2) ne sont pas nommées. Lorsque
          l'adresse d'une socket sans nom est obtenue  avec  getsockname(2),  getpeername(2)  ou  accept(2),  sa
          longueur vaut sizeof(sa_family_t), et il n'est pas nécessaire de vérifier sun_path.

       *  abstraite :  une adresse de socket abstraite se reconnaît par le fait que sun_path[0] est un octet nul
          (« \0 »). L'adresse de la socket dans cet espace est donnée par le reste des octets dans sun_path  qui
          sont  couverts  par  la  longueur  indiquée de la structure de l'adresse. (Les octets nuls dans le nom
          n'ont pas de signification particulière.) Le nom n'a aucun rapport avec les chemins  d'accès  sur  les
          systèmes  de  fichiers.  Lorsque  l'adresse  d'une  socket  abstraite est obtenue avec getsockname(2),
          getpeername(2) ou accept(2), l'addrlen obtenue est plus grande que  sizeof(sa_family_t)  (c'est-à-dire
          plus  grande  que  2),  et  le  nom  de  la  socket  est  contenu  dans  les  premiers bits (addrlen -
          sizeof(sa_family_t)) de sun_path. L'espace de noms des sockets abstraites est une extension Linux  non
          portable.

   Options de sockets
       Pour  des  raisons historiques, les options de ces sockets sont indiquées avec un type SOL_SOCKET même si
       elles sont spécifiques AF_UNIX. Elles peuvent être définies avec setsockopt(2) et lues avec getsockopt(2)
       en indiquant la famille SOL_SOCKET.

       SO_PASSCRED
              Valide  la  réception des identifiants du processus émetteur dans un message annexe. Lorsque cette
              option est active et la socket non encore connectée un nom  unique  dans  l'espace  abstrait  sera
              généré automatiquement. Un attribut booléen entier est attendu.

   Fonctionnalité d'autolien  autobind »)
       Si un appel bind(2) indique addrlen comme sizeof(sa_family_t), ou si l'option de socket SO_PASSCRED était
       indiquée pour une socket qui n'était pas liée explicitement à une adresse, alors la socket est autoliée à
       une  adresse  abstraite.  L'adresse  est  constitué d'un octet nul suivi par cinq octets de l'ensemble de
       caractères [0-9a-f]. Le nombre d'adresses autoliées est donc limité à 2^20  (à  partir  de  Linux 2.1.15,
       quand  la  fonctionnalité d'autolien a été ajoutée, huit octets étaient utilisés, et le nombre d'adresses
       autoliées était donc limité à 2^32. La modification à cinq octets est intervenue avec Linux 2.3.15).

   API des sockets
       Les paragraphes suivants décrivent des détails spécifiques au domaine UNIX,  et  des  fonctionnalités  de
       l'API des sockets du domaine UNIX non prises en charge sous Linux.

       Les sockets de domaine UNIX ne prennent pas en charge la notion de données hors-bande (l'attribut MSG_OOB
       de send(2) et recv(2)).

       L'attribut MSG_MORE de send(2) n'est pas pris en charge sur les sockets de domaine UNIX.

       L'utilisation de MSG_TRUNC dans la paramètre flags de recv(2) n'est pas prise en charge sur  les  sockets
       de domaine UNIX.

       L'option  SO_SNDBUF  a  un  effet  pour  les sockets de domaine UNIX, mais SO_RCVBUF n'en a pas. Pour les
       sockets datagramme, la valeur SO_SNDBUF  impose  une  limite  supérieure  à  la  taille  des  datagrammes
       sortants.  Cette  limite  est calculée comme le double de la valeur de l'option, moins 32 octets utilisés
       par le système (consultez socket(7)).

   Messages annexes
       Les données annexes sont envoyées et reçues en utilisant  sendmsg(2)  et  recvmsg(2).  Pour  des  raisons
       historiques, les messages annexes listés ci-dessous sont indiqués avec un type SOL_SOCKET même s'ils sont
       spécifiques AF_UNIX. Pour les  envoyer,  définissez  le  champ  cmsg_level  de  la  structure  cmsghdr  à
       SOL_SOCKET et le champ cmsg_type avec le type du message. Pour plus de détails, consultez cmsg(3).

       SCM_RIGHTS
              Envoie  ou  reçoit un jeu de descripteurs de fichier ouverts par un autre processus. La portion de
              données contient une table de descripteurs. Les descripteurs  passés  se  comportent  comme  s'ils
              avaient été créés avec dup(2).

       SCM_CREDENTIALS
              Envoyer   ou   recevoir   les   identifiants  UNIX.  Ça  peut  servir  à  l'authentification.  Les
              identifications sont passés en message annexe en struct  ucred.  La  structure  est  définie  dans
              <sys/socket.h> comme ceci :

                  struct ucred {
                      pid_t pid;    /* PID processus émetteur */
                      uid_t uid;    /* UID processus émetteur */
                      gid_t gid;    /* GID processus émetteur */
                  };

              Depuis  la  glibc 2.8,  la  macro  de test de fonctionnalités _GNU_SOURCE doit être définie (avant
              d'inclure tout fichier d'en‐tête) afin d'obtenir la définition de cette structure.

              Les identifiants que l'émetteur envoie sont vérifiés par  le  noyau.  Un  processus  avec  un  UID
              effectif  nul est autorisé à indiquer des valeurs autres que les siennes. L'émetteur doit indiquer
              son propre PID (sauf s'il a la capacité CAP_SYS_ADMIN), son UID réel, effectif ou sauvé (sauf s'il
              a  la  capacité  CAP_SETUID),  et  son  GID  réel,  effectif  ou  sauvé  (sauf  s'il a la capacité
              CAP_SETGID). Pour recevoir un message struct ucred l'option SO_PASSCRED doit être validée  sur  la
              socket.

   Ioctls
       Les ioctl(2)s suivants renvoient des informations dans valeur. La syntaxe correcte est :

              int value;
              error = ioctl(unix_socket, ioctl_type, &value);

       ioctl_type peut être :

       SIOCINQ
              Renvoie  la quantité de données non lues en attente dans le tampon de réception. La socket ne doit
              pas être dans l'état  LISTEN,  sinon  l'erreur  EINVAL  est  renvoyée.  SIOCINQ  est  défini  dans
              <linux/sockios.h>. Une alternative est d'utiliser le synonyme FIONREAD, défini dans <sys/ioctl.h>.

ERREURS

       EADDRINUSE
              L'adresse locale indiquée est déjà utilisée ou l'objet existe déjà dans le système de fichiers.

       ECONNREFUSED
              L'adresse  distante indiquée par connect(2) n'était pas une socket en attente de connexions. Cette
              erreur peut également se produire si le nom de fichier cible n'est pas une socket.

       ECONNRESET
              La socket distante a été fermée de manière inattendue.

       EFAULT Adresse mémoire utilisateur incorrecte.

       EINVAL Argument non valable. Une cause habituelle est que la valeur de AF_UNIX n'était pas indiquée  dans
              le  champ  sun_type  de  l'adresse  passée,  ou  que la socket était dans un état non valable pour
              l'opération.

       EISCONN
              connect(2) a été appelée sur une socket déjà connectée, ou l'adresse cible a été indiquée sur  une
              socket connectée.

       ENOENT Le chemin de l'adresse distante indiquée à connect(2) n'existait pas.

       ENOMEM Plus de mémoire disponible.

       ENOTCONN
              L'opération nécessite une adresse cible, mais la socket n'est pas connectée.

       EOPNOTSUPP
              Opération de flux sur une socket non orientée flux, ou tentative d'utiliser des options de données
              hors-bande.

       EPERM  L'émetteur a transmis des identifiants incorrects dans la struct ucred.

       EPIPE  La socket distante, de type flux, a été fermée. Dans ce cas un signal SIGPIPE est émis  également.
              Cela peut être évité en passant l'attribut MSG_NOSIGNAL dans sendmsg(2) ou recvmsg(2).

       EPROTONOSUPPORT
              Le protocole passé n'est pas AF_UNIX.

       EPROTOTYPE
              La socket distante ne correspond pas au type local (SOCK_DGRAM contre SOCK_STREAM)

       ESOCKTNOSUPPORT
              Type de socket inconu.

       D'autres  erreurs  peuvent être déclenchées par le niveau socket générique ou par le système de fichiers.
       Consultez les pages de manuel correspondantes pour plus de détails.

VERSIONS

       SCM_CREDENTIALS et l'espace de noms abstrait ont été introduits avec Linux 2.2 et  ne  doivent  pas  être
       utilisés  dans  des  programmes  portables. (Certains systèmes dérivés de BSD prennent aussi en charge le
       passage d'identifiants, mais les détails d'implémentation diffèrent).

NOTES

       Dans l'implémentation Linux, les sockets qui sont visibles dans  le  système  de  fichiers  honorent  les
       permissions  du  répertoire où elles se trouvent. Leur propriétaire, groupe et autorisations peuvent être
       changés. La création d'une nouvelle socket échouera si le processus n'a  pas  le  droit  d'écrire  et  de
       parcourir  (exécution)  dans  le  répertoire où elle est créée. La connexion sur une socket nécessite les
       permissions de lecture/écriture. Le comportement  diffère  de  plusieurs  systèmes  dérivés  de  BSD  qui
       ignorent  les  permissions  sur  les  sockets  de  domaine  UNIX. Les programmes portables ne doivent pas
       s'appuyer sur ces fonctionnalités pour la sécurité.

       Lier une socket avec un nom de fichier crée la socket dans le système de fichiers, qu'il faudra  détruire
       lorsqu'elle  n'est  plus  utile  (en  appelant  unlink(2)). La sémantique habituelle UNIX s'applique ; la
       socket peut être effacée à tout moment, et sera effectivement supprimée  lorsque  sa  dernière  référence
       sera fermée.

       Pour  passer un descripteur ou des identifiants par dessus un SOCK_STREAM, il faut envoyer ou recevoir au
       moins un octet de donnée non méta dans l'appel sendmsg(2) ou recvmsg(2) correspondant.

       Les sockets flux UNIX ne prennent pas en charge la notion de données hors-bande.

EXEMPLE

       Consultez bind(2).

       Pour un exemple de l'utilisation de SCM_RIGHTS, consultez cmsg(3).

VOIR AUSSI

       recvmsg(2), sendmsg(2), socket(2), socketpair(2), cmsg(3), capabilities(7), credentials(7), socket(7)

COLOPHON

       Cette page fait partie de la publication 3.57 du projet man-pages Linux. Une description du projet et des
       instructions     pour     signaler     des     anomalies    peuvent    être    trouvées    à    l'adresse
       http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par
       l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>.

       Christophe       Blaess       <http://www.blaess.fr/christophe/>      (1996-2003),      Alain      Portal
       <http://manpagesfr.free.fr/> (2003-2006).  Julien  Cristau  et  l'équipe  francophone  de  traduction  de
       Debian (2006-2009).

       Veuillez  signaler  toute erreur de traduction en écrivant à <debian-l10n-french@lists.debian.org> ou par
       un rapport de bogue sur le paquet manpages-fr.

       Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « man -L C
       <section> <page_de_man> ».