Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » LOG-File erstellen mit stdout

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
15.05.2006, 11:18 Uhr
flappinski



Guten Morgen,
ich habe folgendes Problem: Im Laufe eines Programmablaufes werden von meinem Programm viele Nachrichten auf den Bildschirm ausgespuckt, manchmal auch Fehlermeldungen (also eigene) und nachfolgend das Programm abgebrochen. Manchmal läuft das Programm auch im Hintergrund, d.h. es hat keinen Kontakt zur Konsole.
Nun hätte ich gerne eine Art Log-File, das diese Ausgabe "mitschreibt". Ich kann natürlich die Ausgabe des Programms bei Ausführung mit ">" umleiten, aber dann sehe ich ja gar nichts mehr auf dem Bildschirm. Zur Zeit schreibe ich das Programm folgendermassen um: Ich schreibe die Ausgabe in einen Stream, der bei Bedarf nach Umwandlung in eine String in stdout und in eine Datei geschrieben wird. Das kann es nicht sein, oder? Das ist echt mühselig und whrscheinlich SEHR unelegant. (Das hätte zwar den Vorteil, dass es iim Rest des Programms nicht gerade auffallen würde, aber manchmal kann man ja auch Ausnahmen machen, )
Vielleicht hat ja jemand einen eleganten Vorschlag.Danke,
Stephan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.05.2006, 11:45 Uhr
Pler
Einer von Vielen
(Operator)


Klar, das geht ganz einfach.
Du startest ja dein Programm sicherlich mit -d oder sowas, damit es sich in den Hintergrund verabschiedet.
An der Stelle wo du das machst, schließt du einfach noch stdout und stderr. Danach machst du ein open auf dein Logfile. Das neue open gibt automatisch den Filedeskriptor zurück, den STOUT mal hatte.
Dann werden alle ausgaben, die durch printf sonst auf stdout gegeben werden jetzt in die Datei geleitet.
Du hast stdout sozusagen "umgebogen".
Du kannst auch stderr noch auf stdout zeigen lassen. Dann bekommst du diese Meldungen auch ins Logfile.

Den gesamten Quellcode danach musst du nicht mehr ändern.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.05.2006, 13:07 Uhr
flappinski



Danke für die rasche Antwort. Ich kann Dir leider nicht ganz folgen: Wie "schliesse" ich stdout und stderr, wie öffne ich danach das Log.Fie, dass es das alte stdout aufnimmt?
Sorry, aber ich brauche das konkreter....
Gruss,
Stephan
p.s. mit -d geht bei mir nix, ich mache das mit &
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.05.2006, 13:33 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Es gibt für alle Standardstreams eine Konstante. In deinem Fall STDOUT_FILENO und STDERR_FILENO. Diese musst du dann mit


C++:
close(STDOUT_FILENO);


schießen. Nun öffnest du sie wieder mit:


C++:
open("foooooo.txt", O_WRONLY|O_CREAT|O_APPEND);


Das O_WRONLY heißt, das sie nur zum schreiben geöffnet werden soll, O_CREAT heißt, das die Datei angelegt werden soll, wenn es sie noch nicht gibt und O_APPEND bedeutet, das es die ausgabe anhängen soll, wenn die datei schon existiert.
Jede Ausgabe, die du jetzt mit printf() machst, landet nu in der Datei. Einbinden musst du fcntl.h

EDIT:
Ich hatte gerade ein Gespräch mit mike im IRC, freopen() wäre daauch möglich, was man lieber macht ist ansichtssache *g*


C++:
freopen("fooooooo.txt", "a+", stdout);

Hier musst du stdio.h includieren, wirst du aber wohl eh schon haben
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

Dieser Post wurde am 15.05.2006 um 13:58 Uhr von J-jayz-Z editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.05.2006, 14:53 Uhr
flappinski



Jut, halbe Miete ist drin!
Jetzt habe ich das Problem, dass ich eigentlich die Bildshirmausgabe haben möchte, wenn der Prozess nicht im Hitergrund ist! Also, eigentlich will ich, dass das Log-File nur mitschreibt, was auf dem Bildschirm passiert und nicht, dass der Stream "geklaut" wird.
Wahrscheinlich muss ich dann doch zwei mal ausgeben: einmal auf den Bildschirm und einmal in die Datei, oder?
Grüsse,
Stephan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.05.2006, 15:09 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Hmm, das wird nicht gehen, wenn du mit & startest.
Da musst du schon anschauen, wie man in C einen eigenen Daemon programmiert und ihn eben nur mit einem switch starten lassen(-d ). Wenn -d aktiviert ist, dann leitest du STDOUT um, ansonsten nicht. Ich denke nicht, das man in einem programm abfragen kann, ob der user es in den Hintergrund gesetzt hat. Zumindest nicht ohne sehr viel Aufwand.
Das sagte mit google dazu: http://unixfreunde.de/thread.php?threadid=1564

EDIT:
Für den switch kannst du dir mal getopt anschauen, google oder diene man pages verraten dir, was ich damit mein
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

Dieser Post wurde am 15.05.2006 um 15:09 Uhr von J-jayz-Z editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
15.05.2006, 15:21 Uhr
flappinski



Moment, das mit dem Hintergrund fragt man mit isatty(1) ab. Das ist nicht das Problem.
Mein Problem ist, wenn das Programm im Vordergrund läuft will ich, dass es einerseits den Bildschirm bedient UND gleichzeitig ein Log-File mit der gleichen Information mitschreibt!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
15.05.2006, 15:27 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Dann würde ich sagen, wenn er im Hintergrund läuft, leitest du STDOUT um und wenn nicht, musst du eben anderst mit den meldungen verfahren.
In Perl geht das, das man STDOUT an STDOUT(Bildschirm) und an eine Datei bindet, wie man das in C macht, damit bin ich grad etwas überfragt...
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
15.05.2006, 15:52 Uhr
flappinski



oh, jetzt habe rumprobiert und leider erfahren müssen, dass isatty(1) nur testet, od die Ausgabe extern in einen Datei umgeleitet wird, also mit "a.out > temp", oder ähnliches. Bei Senden des Prozesses in den Hintergrund funktioniert das leider nicht.
Aber zum Grundpoblem: STDOUT auf Datei umleiten kann ich ja auch inzischen, aber ich will ja stdout nicht umleiten, sondern nur mitschreiben, sozusagen kopieren. Wenn das funktionieren würde könnte ich ja dann die Programmausgabe bei Prozessen im Hintergrund auf /dev/null umleiten.
Kann ich einen Stream an eine Funktion übergeben? Hat da jemand Erfahrung?
Danke und Grüsse,
Stephan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
15.05.2006, 16:30 Uhr
virtual
Sexiest Bit alive
(Operator)


Ja, das geht schon. Ich habe da vor einer Zeit einen teeStream geschrieben. Der arbeitet im Prinzip wie tee. www.dev-geeks.org/index.php?module=scripts&sub=2&action=show&id=11
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: