Envoi du descripteur de fichier sur un socket de domaine UNIX et sélectionnez ()

Je suis en utilisant un socket de domaine UNIX pour le transfert d'un descripteur de fichier à un autre processus. Cela fonctionne bien, mais quand j'ai d'abord essayer de voir si le socket est accessible en écriture à l'aide de select(), l'appel sendmsg() échoue avec un Mauvais Descripteur de Fichier d'erreur.

La sendmsg() fonction ne fonctionne bien en combinaison avec select() si je n'ai pas ajouter le descripteur de fichier info de la struct msghdr, de sorte que le conflit semble être entre de select() et le transfert de descripteurs de fichiers.

Je ne pouvais pas trouver toutes les informations sur ce sujet dans les pages de man pour la sélectionner(), recvmsg(), ou dans tout autre. Depuis ce doit être un serveur qui distribue les descripteurs de fichiers à des processus multiples, je voudrais encore être en mesure d'utiliser select().

Est-ce que je peux faire pour faire ce travail, ou quelqu'un sait-il d'autres solutions?

Plate-forme est Ubuntu 10.4.

C'est le code qui initialise les structures:



struct cmsghdr_fd : public cmsghdr
{
  int fd;
};

int sendfd(int sock, int fd)
{
  struct msghdr hdr;
  struct iovec data;
  struct cmsghdr_fd msgdata;

  char dummy = '*';
  data.iov_base = &dummy;
  data.iov_len = sizeof(dummy);

  hdr.msg_name = NULL;
  hdr.msg_namelen = 0;
  hdr.msg_iov = &data;
  hdr.msg_iovlen = 1;
  hdr.msg_flags = 0;

  hdr.msg_control = &msgdata;
  hdr.msg_controllen = sizeof(msgdata);

  struct cmsghdr* cmsg = CMSG_FIRSTHDR(&hdr);
  cmsg->cmsg_len   = hdr.msg_controllen;
  cmsg->cmsg_level = SOL_SOCKET;
  cmsg->cmsg_type  = SCM_RIGHTS;

  *(int*)CMSG_DATA(cmsg) = fd;

  int n = sendmsg(sock, &hdr, 0);

  if(n == -1)
    printf("sendmsg() failed: %s (socket fd = %d)\n", strerror(errno), sock);

  return n;
}

Encore une fois, cela fonctionne, tant que je n'ai pas l'appel select() pour vérifier si le support est prêt pour l'écriture.

source d'informationauteur svdree