Discussion:
Umleiten von FILE* (Datei => stdout) bzw fopen ersetzen
(zu alt für eine Antwort)
Robert Hartmann
2015-06-20 06:20:14 UTC
Permalink
Raw Message
Hallo zusammen,

In meinem C-Programm nutze ich eine Bibliotheksfunktion,
die ihr Berechnungsergebnis in eine Datei schreibt.

Leider hat die Bibliothek es nicht vorgesehen, dass
man als Nutzer den Ort an den die Bib ihr Ergebnis heraus schreibt
wirklich beeinflussen kann.

Zwar kann man den Namen der Datei in bestimmten Grenzen beeinflussen;
aber ich möchte überhaupt keine Datei, sondern ich möchte, dass das
Ergebnis nach stdout geschrieben werden soll.


Ich möchte also, dass der Aufruf in meinem Programm von

bibliotheks_fnk(inputdata);

statt eine neue Datei anzulegen tatsächlich auf stdout schreibt.


Da der durch die Bibliothek erzeugte Dateiname fest dokumentiert ist,
ist mir die Frage gekommen, ob man die C-Runtime-Umgebung irgendwie
veranlassen kann, einen FILE* auf stdout zurückzugeben,
wenn fopen als Parameter den Dateinamen erhält.

Gruß Robert
Stefan Reuther
2015-06-20 08:34:07 UTC
Permalink
Raw Message
Post by Robert Hartmann
Ich möchte also, dass der Aufruf in meinem Programm von
bibliotheks_fnk(inputdata);
statt eine neue Datei anzulegen tatsächlich auf stdout schreibt.
Da der durch die Bibliothek erzeugte Dateiname fest dokumentiert ist,
ist mir die Frage gekommen, ob man die C-Runtime-Umgebung irgendwie
veranlassen kann, einen FILE* auf stdout zurückzugeben,
wenn fopen als Parameter den Dateinamen erhält.
In der C-Runtime gibt es da nichts (außer Ferkeleien mit "wir schreiben
eine Funktion 'open', die den Syscall ersetzt").

Die meisten Betriebssysteme haben aber Devicenamen, mit denen man etwas
ähnliches erreichen kann. Unter Linux wäre das '/dev/stdout'. Unter
Windows finde ich jetzt auf die Schnelle nichts 100% äquivalentes, aber
da gibt's immerhin 'con' als Gerätenamen für die Konsole.


Stefan
Robert Hartmann
2015-06-20 10:17:13 UTC
Permalink
Raw Message
Hallo Stefan,
Post by Stefan Reuther
Post by Robert Hartmann
Ich möchte also, dass der Aufruf in meinem Programm von
bibliotheks_fnk(inputdata);
statt eine neue Datei anzulegen tatsächlich auf stdout schreibt.
Da der durch die Bibliothek erzeugte Dateiname fest dokumentiert ist,
ist mir die Frage gekommen, ob man die C-Runtime-Umgebung irgendwie
veranlassen kann, einen FILE* auf stdout zurückzugeben,
wenn fopen als Parameter den Dateinamen erhält.
In der C-Runtime gibt es da nichts
schade.
Post by Stefan Reuther
(außer Ferkeleien mit "wir schreiben
eine Funktion 'open', die den Syscall ersetzt").
dann wird es auf so etwas heraus laufen.
Post by Stefan Reuther
Die meisten Betriebssysteme haben aber Devicenamen, mit denen man etwas
ähnliches erreichen kann. Unter Linux wäre das '/dev/stdout'. Unter
Windows finde ich jetzt auf die Schnelle nichts 100% äquivalentes, aber
da gibt's immerhin 'con' als Gerätenamen für die Konsole.
Die Idee mit den Devicenamen ist nicht schlecht, funktioniert aber
nicht, da die Bibliothek aus "/dev/stdout"
"/dev/stdout_bibliotheks_suffix" oder unter Windows "CON_bibliotheks_suffix"

macht.

Gruß Robert
Peter J. Holzer
2015-06-20 12:31:59 UTC
Permalink
Raw Message
Post by Robert Hartmann
Post by Stefan Reuther
Die meisten Betriebssysteme haben aber Devicenamen, mit denen man etwas
ähnliches erreichen kann. Unter Linux wäre das '/dev/stdout'. Unter
Windows finde ich jetzt auf die Schnelle nichts 100% äquivalentes, aber
da gibt's immerhin 'con' als Gerätenamen für die Konsole.
Die Idee mit den Devicenamen ist nicht schlecht, funktioniert aber
nicht, da die Bibliothek aus "/dev/stdout"
"/dev/stdout_bibliotheks_suffix" oder unter Windows "CON_bibliotheks_suffix"
Symlink /tmp/stdout_bibliotheks_suffix -> /dev/stdout anlegen und
Bibliothek darauf schreiben lassen?

hp
--
_ | Peter J. Holzer | Fluch der elektronischen Textverarbeitung:
|_|_) | | Man feilt solange an seinen Text um, bis
| | | ***@hjp.at | die Satzbestandteile des Satzes nicht mehr
__/ | http://www.hjp.at/ | zusammenpaßt. -- Ralph Babel
Stefan Ram
2015-06-20 14:02:50 UTC
Permalink
Raw Message
Post by Robert Hartmann
Die Idee mit den Devicenamen ist nicht schlecht, funktioniert aber
nicht, da die Bibliothek aus "/dev/stdout"
"/dev/stdout_bibliotheks_suffix" oder unter Windows "CON_bibliotheks_suffix"
Unter Windows könnte es gehen, wenn »CON:« verwendet wird,
da »CON:_bibliotheks_suffix« möglicherweise ebenfalls auf
die Konsole schreibt.
Robert Hartmann
2015-06-20 21:18:47 UTC
Permalink
Raw Message
Hallo Stefan,
Post by Stefan Ram
Post by Robert Hartmann
Die Idee mit den Devicenamen ist nicht schlecht, funktioniert aber
nicht, da die Bibliothek aus "/dev/stdout"
"/dev/stdout_bibliotheks_suffix" oder unter Windows "CON_bibliotheks_suffix"
Unter Windows könnte es gehen, wenn »CON:« verwendet wird,
da »CON:_bibliotheks_suffix« möglicherweise ebenfalls auf
die Konsole schreibt.
Unter WinXP sendet das Compilat meiner C-Anwendung nun tatsächlich die
Ergebnisse der compilierten C-Bibliothek an die Konsole (CMD.exe), wenn
der Dateiname mit "CON:" beginnt.

Cool, Besten Dank!


Wenn ich das in Eclipse/CDT ausführe, wird das Ergebnis nicht angezeigt,
bzw nicht von einem anderen Eclipse-Plugin abgegriffen.

Aber das hat sicher etwas mit der Interaktion von Java und Windows via
Eclipse zu tun und ist sicher in der Java-Gruppe nun besser aufgehoben.
Daher fup nach de.comp.lang.java.

Gruß Robert
Stefan Reuther
2015-06-21 11:01:21 UTC
Permalink
Raw Message
Post by Robert Hartmann
Post by Stefan Ram
Post by Robert Hartmann
Die Idee mit den Devicenamen ist nicht schlecht, funktioniert aber
nicht, da die Bibliothek aus "/dev/stdout"
"/dev/stdout_bibliotheks_suffix" oder unter Windows
"CON_bibliotheks_suffix"
Unter Windows könnte es gehen, wenn »CON:« verwendet wird,
da »CON:_bibliotheks_suffix« möglicherweise ebenfalls auf
die Konsole schreibt.
Unter WinXP sendet das Compilat meiner C-Anwendung nun tatsächlich die
Ergebnisse der compilierten C-Bibliothek an die Konsole (CMD.exe), wenn
der Dateiname mit "CON:" beginnt.
[...]
Post by Robert Hartmann
Wenn ich das in Eclipse/CDT ausführe, wird das Ergebnis nicht angezeigt,
bzw nicht von einem anderen Eclipse-Plugin abgegriffen.
Aber das hat sicher etwas mit der Interaktion von Java und Windows via
Eclipse zu tun und ist sicher in der Java-Gruppe nun besser aufgehoben.
Nein, das hat damit zu tun, dass "CON:" eben nicht stdout ist, sondern
die Konsole. Eclipse hat die Ausgabe umgeleitet (wahrscheinlich in eine
Pipe, viel mehr Alternativen gibt es unter Windows nicht), und erwartet
deine Ausgaben nun da. Du schreibst aber auf das Konsolendevice, welches
es in der Konstellation nicht gibt bzw. was nicht sichtbar ist.

Im Gegensatz dazu ist "/dev/stdout" unter Linux tatsächlich das
umgeleitete stdout ("CON:" entspricht eher "/dev/tty").

Letztlich ist dein Problem nur system- und bibliotheksspezifisch lösbar.
Bei manchen Bibliotheken kann man spezielle Dateinamen registrieren, die
dann intern behandelt werden (das kenne ich allerdings mehr von
Embedded). Du schreibst, es sei eine DLL im Spiel. Da kann man dann mit
Sicherheit auch am dynamischen Lader rumfummeln und Sprungtabellen
verbiegen, das geht aber schon sehr ans Eingemachte (sprich: ich hab nur
eine Lösung parat, für die die DLL gepatcht werden müsste; ich meine
aber gelesen zu haben, dass das auch wohldefiniert zur Laufzeit geht).


Stefan

Hermann Riemann
2015-06-20 10:41:53 UTC
Permalink
Raw Message
Post by Robert Hartmann
Zwar kann man den Namen der Datei in bestimmten Grenzen beeinflussen;
aber ich möchte überhaupt keine Datei, sondern ich möchte, dass das
Ergebnis nach stdout geschrieben werden soll.
Kommando ln -s /dev/stdout Dateiname

Hermann
der aber nicht sicher ist, wie Datensicherungen darauf reagieren.
--
http://www.Hermann-Riemann.de
Rainer Weikusat
2015-06-20 16:13:57 UTC
Permalink
Raw Message
Post by Robert Hartmann
In meinem C-Programm nutze ich eine Bibliotheksfunktion,
die ihr Berechnungsergebnis in eine Datei schreibt.
Leider hat die Bibliothek es nicht vorgesehen, dass
man als Nutzer den Ort an den die Bib ihr Ergebnis heraus schreibt
wirklich beeinflussen kann.
Zwar kann man den Namen der Datei in bestimmten Grenzen beeinflussen;
aber ich möchte überhaupt keine Datei, sondern ich möchte, dass das
Ergebnis nach stdout geschrieben werden soll.
Ich möchte also, dass der Aufruf in meinem Programm von
bibliotheks_fnk(inputdata);
statt eine neue Datei anzulegen tatsächlich auf stdout schreibt.
Da der durch die Bibliothek erzeugte Dateiname fest dokumentiert ist,
ist mir die Frage gekommen, ob man die C-Runtime-Umgebung irgendwie
veranlassen kann, einen FILE* auf stdout zurückzugeben,
wenn fopen als Parameter den Dateinamen erhält.
Falls Du nur eine kompilierte Bibliothek hast, sollte es moeglich sein,
den fopen-Aufruf im Binary durch einen Auruf von etwas anderem zu
ersetzen, das du kontrollierst. Falls das dieselbe Signatur
(Rueckgabewert + Parameter) hat wie fopen sollte das nicht allzu
kompliziert sein.
Robert Hartmann
2015-06-20 21:47:04 UTC
Permalink
Raw Message
Hallo,
Post by Rainer Weikusat
Falls Du nur eine kompilierte Bibliothek hast,
Im konkreten habe ich eine kompilierte Bibliothek (.dll unter Windows).
Post by Rainer Weikusat
sollte es moeglich sein, den fopen-Aufruf im Binary durch einen Aufruf
von etwas anderem zu ersetzen, das du kontrollierst.
Falls das dieselbe Signatur
(Rueckgabewert + Parameter) hat wie fopen sollte das nicht allzu
kompliziert sein.
So eine Funktion "myfopen" in C zuschreiben, die dann etwas anders
arbeitet, sollte machbar sein :-)

Aber wie bekomme ich die fremde DLL dazu meine Funktion zu nutzen?
Da werde ich wohl noch etwas nachdenken müssen...

Gruß Robert
Loading...