2010-11-30 10 views
0

Ich habe ein Programm, das ein paar Sockets öffnet, um zu hören und zu senden. Ich habe einen sehr seltsamen Zustand gefunden, so weit nur unter Mac OS X, wo gethostbyname das Programm komplett einfriert.gethostbyname friert ein und verwendet 100% CPU unter Mac OS X

Erstens bin ich nicht mit Threads. Zweitens tritt das Problem nur auf, wenn ich zwei Kopien meines Testprogramms gleichzeitig laufe.

Die erste Instanz erstellt 4 sendende und 4 empfangende Sockets und beginnt dann, Datenverkehr an andere zu senden. In der Netzwerkbibliothek, die ich für Messaging verwende, wird gethostbyname() aufgerufen, unmittelbar nachdem der empfangende Port geöffnet wurde. Ich habe festgestellt, dass, als ich eine zweite Instanz des Testprogramms gestartet habe, nachdem ich 3 Empfänger geöffnet habe, der letzte gerade dort hängen geblieben ist.

Ich habe das Problem bis auf den Anruf auf gethostbyname eingegrenzt, die scheinbar nie zurückgibt. (Beachten Sie, dass es bei jedem Aufruf von gethostbyname bis zu diesem Punkt funktionierte.) Wenn dieser Punkt erreicht wird, springt die CPU-Auslastung des Testprogramms plötzlich auf 100%, als ob es eine Endlosschleife in gethostbyname gäbe. Außerdem kann ich den Prozess nicht Ctrl-C, ich muss es von einem anderen Terminal aus töten.

Offensichtlich ist dieses Verhalten inakzeptabel, auch wenn es nur in diesem extremen Fall des Startens von 8 Sender/Empfänger-Paaren auftritt. (4 in einem Prozess, 4 in einem anderen Prozess.) Hat jemand das schon einmal gesehen und wie kann ich es vermeiden?

Übrigens ist die einzige andere getestete Plattform Linux (Ubuntu 10.04), wo es gut läuft.

+1

Tritt dieses Problem auf allen Macs oder nur einer? Wenn Letzteres, vielleicht hat dieser Mac eine Art von Netzwerkkonfigurationsproblem. –

+0

Ich habe nur auf einem Mac getestet .. danke für den Vorschlag, ich werde einen anderen versuchen. – Steve

+0

Können wir Ihren Code sehen? Neulich hatte ich einen Fehler, der zu lesen schien() endlos zu blockieren, aber eigentlich eine Endlosschleife woanders war. Wenn die CPU auf 100% springt, klingt es so, als hätten Sie auch eine unendliche nicht-blockierende Schleife. – AlastairG

Antwort

0

Es klingt, als ob Sie von diesem Oracle Java Bug gestochen worden sein könnten. Mein Workaround war das Hinzufügen des Host-Namens meines Mac zu/etc/hosts

sudo bash -c "echo 127.0.0.1 $HOSTNAME >> /etc/hosts"