2016-05-09 6 views
0

Ich schreibe eine Anwendung in C++, die das stdout verwenden muss, um Antworten auszugeben (es ist ein CGI-BIN-Daemon vom Apache-Webserver aufgerufen, und der Apache erhält das stdout der Binärdatei als Antwort).Shared Library wird in stdout ausgegeben

Das große Problem ist, dass ich eine gemeinsam genutzte Bibliothek verwende und es gibt auch Protokolle in das stdout aus, diese Protokolle gehen direkt zum HTTP-Client und können die eigentlichen HTTP-Antworten nicht analysieren.

Meine Frage ist, gibt es eine Möglichkeit, die Ausgaben aus der gemeinsam genutzten Bibliothek unterdrücken kann?

PS: Ich bin es auf Linux laufen und mit * .so Bibliotheken

Vielen Dank im Voraus

+0

Sie müssten die Bibliothek mit allen Optionen (oder Code Hacker) neu erstellen, um sie zu unterdrücken. Das heißt, wissen Sie sicher, dass die Bibliothek auf stdout und nicht stderr ausgibt? – mah

+0

Ja, ich bin mir sicher, dass die Bibliothek ausgegeben wird, sie gibt sogar ihren Namen in Logs aus. Nun, es ist eine Drittanbieter-Bibliothek, es ist nicht möglich, sie neu zu erstellen. –

+0

Wenn aus irgendeinem Grund @ JesperJuhls Antwort nicht hilft, könnte eine andere Möglichkeit sein, Ihre CGI-Binärdatei in eine Apache-Seite zu teilen, die diese .so nicht verwendet, und eine sekundäre ausführbare Datei, die das tut; diese sekundäre ausführbare Datei würde mit einem anderen stdout erzeugt werden und einen privaten Kommunikationskanal zu dem primären haben (der dann nur als Relais fungiert). Ziemlich hässlich ... hässlicher, als die dritte Partei aufzuspüren und sie dazu zu bringen, ihre zerbrochene Bibliothek zu reparieren :-) – mah

Antwort

0

1) das ist eine schlechte Bibliothek. Bibliotheken sollten nicht in stdout schreiben.

2) Sie können es vielleicht umgehen, indem Sie den Stdout-Dateideskriptor im stderr-Deskriptor duplizieren und dann stdout schließen. Fühlt sich aber wie ein hässlicher Hack an.

+0

Ja, es ist nicht die beste Bibliothek. Können Sie einen Lösungscode dafür einstellen? –

+0

@Diego Tsutsumi: Sie können das selbst leicht erforschen. Hinweise 'dup (2)' und 'close()'. –

+0

Danke für die Hinweise :). Es gibt ein anderes Problem, die Bibliothek gibt 3 Zeilen des Protokolls aus, bevor meine Hauptfunktion vom System aufgerufen wird. So etwas wie "Bibliothek erfolgreich geladen", in diesem Fall würde Ihre Lösung nicht funktionieren, weil ich später dup (2) und close() aufrufen würde. –