2017-02-19 1 views
-1

Ich benutze socketpair() Systemaufruf für IPC und es gibt 0,1 oder 2 Dateideskriptor zurück, wenn einer von ihnen verfügbar ist. Der Systemaufruf write() für fd 0 schreibt in STDIN, wodurch die Ausgabe meiner Anwendung durcheinander gebracht wird. Gibt es etwas, das ich tun kann, um zu verhindern, dass das Socketpair() 0,1 oder 2 als fd zurückgibt?Wie verhindere ich, dass der Systemaufruf socket() den Dateideskriptor 0,1 oder 2 zurückgibt?

+2

Mit 'write()' an FD 0 wird geschrieben, mit wem 0 verbunden ist. Wenn es ein Socket ist, ist es nicht "stdin", und es kann nicht "die Ausgabe Ihrer Anwendung durcheinander bringen". Es ist nicht klar, dass Sie ein Problem zu lösen haben. – EJP

+1

Der Rückgabewert von socketpair ist ** nicht ** ein Dateideskriptor, es ist ein Statuscode (-1 oder 0), dh Fehler oder Erfolg. – wildplasser

+0

Mein Schlechter, ich wollte sagen, dass der Socket den Dateideskriptor 0,1 oder 2 zugewiesen wird. –

Antwort

1

Schließen Sie Standardeingabe, Standardausgabe oder Standardfehler nicht vor der Verwendung von socketpair(). Ggf. öffnen Sie /dev/null für diese Dateideskriptoren.

Wenn Datei-Deskriptoren (von jedem Systemaufruf - open(), socket(), socketpair(), accept(), pipe(), dup(), usw.) zugeordnet sind, verwendet die Zahl ist immer die niedrigsten verfügbaren (ungeöffnet) Nummer. Wenn Sie 0, 1 oder 2 von socketpair() bekommen, bedeutet das, dass Sie den entsprechenden Deskriptor geschlossen haben - aber warum haben Sie das getan? Vergiss es; mach es nicht.

Oder beheben Sie es durch Öffnen /dev/null. Denken Sie daran, dass 0 lesbar sein sollte und 1 und 2 beschreibbar sein sollten (und dass es egal ist, ob 0 beschreibbar ist und 1 und 2 lesbar sind; tatsächlich, wenn eine Shell in einem Terminal gestartet wird, sind alle drei oft lesbar und beschreibbar).

+0

Sie haben Recht, ich schloss nie die STD *. Das Problem war woanders. –

Verwandte Themen