Senden file-Deskriptor, über UNIX-domain-socket, und wählen Sie()

Ich bin mit einem UNIX-domain-socket für die übertragung einer Datei-descriptor zu einem anderen Prozess. Dies funktioniert gut, aber wenn ich zuerst versuchen, um zu sehen, ob socket beschreibbar ist die Verwendung von select(), die sendmsg () - Aufruf schlägt mit einem Bad File Descriptor " Fehler.

Den sendmsg () - Funktion funktioniert Prima in Kombination mit select (), wenn ich nicht hinzufügen, die den Datei-descriptor info zu den struct msghdr, so dass der Konflikt scheint sich zwischen select() und die übertragung von Datei-Deskriptoren.

Konnte ich nicht finden alle Informationen zu diesem in den man-Seiten zu wählen(), recvmsg(), oder jede andere. Da dies muss zu einem server, die Hände aus Datei-Deskriptoren für mehrere Prozesse, ich würde noch gerne in der Lage sein zu verwenden, wählen Sie().

Gibt es irgendetwas, was ich tun kann, um diese Arbeit zu machen, oder kennt jemand alternative Lösungen?

Plattform ist Ubuntu 10.4.

Das ist der code initialisiert die Strukturen:



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;
}

Wieder, das funktioniert, solange ich nicht anrufen wählen Sie() zuerst zu prüfen, ob der socket ist bereit zum schreiben.

Können Sie Ihr code, füllt msghdr und cmsghdr?
Ich würde stellen Sie sicher, dass Ihre Umgebung den code nicht beschädigen msghdr die Länge (oder die Daten selbst), da von einer sehr kurzen Lesen der kernel das handling, ich denke, das wäre das Problem wahrscheinlich
Ich habe den code, füllt die Strukturen die Frage.
Sie sollten wirklich die Einstellung cmsg_len mit der CMSG_LEN makro, aber ich glaube nicht, dass dies wirklich das problem hier...
Es gibt einige Unterschiede zwischen diesem Kodex und anderen typischen sendfd()'s, die ich gesehen habe - haben diese einen Unterschied machen: code.swtch.com/plan9port/src/0e6ae8ed3276/src/lib9/sendfd.c oder koders.com/c/fidAA01FB46DDB5D83E39B335DA2639B226F39CF21E.aspx

InformationsquelleAutor svdree | 2010-12-20

Schreibe einen Kommentar