On Thu, 10 Feb 2000, Tobias König wrote:
Kann mir jemand sagen, wie man unter C++, nach einem execvp()-Aufruf, den Fehlerausgabekanal auf ein ifstream bzw. ofstream umleitet???
gar nicht.
Errorchannel: filedescriptor=2=STDERR_FILENO, ofstream=cerr
zur Information: execvp ersetzt (wie alle execs) den laufenden Prozess durch ein anderes Programm. Nach einem exec kann man hoechstens noch Fehlerbehandlung machen (a'la: habe das Programm nicht gefunden). Im neu gestarteten Programm wird cerr automatisch auf Descriptor 2 initialisiert.
Stimmt, da musst Du entweder system() nehmen, der kommt zurueck, oder Du stellst dem execvp noch ein fork() voran, ein vfork() taete es hier auch.
Ansonsten kann man (soweit ich weiss) *fstreams auch mit Filedescriptoren initialisieren -> hier also die Konstante STDERR_FILENO.
Ich glaube auch, das geht ... im EXTREMFALL nimmst Du von Qt ein QFile, aus dem Du Dir dann ein QTextStream baust, der im Grunde genauso funzt wie iostream.
Was hattest Du eigentlich vor?
Ich vermute mal ... eine Fortschrittsanzeige aufgrund der Programmausgabe?
Konrad
Hallo,
Was hattest Du eigentlich vor?
Ich vermute mal ... eine Fortschrittsanzeige aufgrund der Programmausgabe?
Fast...
Ich wollte eine graphische Oberfläche für FreePascal schreiben und möchte dabei die Fehlerausgaben des Kommandozeilenprogramms in einem QMultiLineEdit ausgeben.
Hat jemand ein Codebeispiel dafür???
Ciao, Tobias -- Software is like sex: It's better when it's free Linus Torvalds
__________________________________________________________________ Do You Yahoo!? Gesendet von Yahoo! Mail - http://mail.yahoo.de Yahoo! Auktionen - gleich ausprobieren - http://auktionen.yahoo.de
Am Sam, 12 Feb 2000 schrieb Tobias König:
Ich wollte eine graphische Oberfläche für FreePascal schreiben und möchte dabei die Fehlerausgaben des Kommandozeilenprogramms in einem QMultiLineEdit ausgeben.
Hat jemand ein Codebeispiel dafür???
Na wenns ein KDE-Programm werden soll, brauchst du nur kprocess oder so aus libkdecore nehmen, und bekommst die gewünschte Ausgabe in einem QString,denke ich.
Wenn der Tochterprozess allerdings die GUI nicht blockieren soll, gibts mit QT <= 1.44 Probleme, da Multithreading damit nicht so einfach ist (Bastel/Lese-Arbeit), besonders wenn du von beiden Threads aus auf Qt-Objekte zugreifen willst.
Mit Qt >= 2.0 sollte das aber problemlos klappen ...
Bye, Stephan
Hallo,
Ich habe das mit KProcess ausprobiert, komme aber nicht weiter... Der Codeauszug lautet: ------------------------- #include "KHtml.h" #include "KHtml.moc" #include <kprocess.h> #include <kapp.h> #include <iostream.h>
KHtmlWidget::KHtmlWidget() { KProcess proc;
proc << "ls" << "-l" << "/home"; // bei 'ls' müßte eine Ausgabe erfolgen
proc.start(KProcess::NotifyOnExit, KProcess::AllOutput);
connect(&proc, SIGNAL(receivedStderr(KProcess *, char *, int)), this, SLOT(getErrors(KProcess *, char *, int)));
connect(&proc, SIGNAL(receivedStdout(KProcess *, char *, int)), this, SLOT(getErrors(KProcess *, char *, int))); }
void KHtmlWidget::getErrors(KProcess *proc, char *buffer, int length) { cout << buffer << "\n"; printf("Hallo Welt\n"); } ... --------------------------- (Laßt euch durch das KHtmlWidget nicht stören :))
Nur schreibt das Programm weder <buffer> noch "Hallo Welt", also wird die Funktion getErrors() gar erst nicht ausgeführt... Warum???
Ciao, Tobias
P.S. getErrors() ist ordnungsgemäß in KHtml.h als 'public slot' eingetragen :) -- Software is like sex: It's better when it's free Linus Torvalds
__________________________________________________________________ Do You Yahoo!? Gesendet von Yahoo! Mail - http://mail.yahoo.de Yahoo! Auktionen - gleich ausprobieren - http://auktionen.yahoo.de
On Sun, 13 Feb 2000, Tobias König wrote:
Hallo,
Ich habe das mit KProcess ausprobiert, komme aber nicht weiter... Der Codeauszug lautet:
#include "KHtml.h" #include "KHtml.moc" #include <kprocess.h> #include <kapp.h> #include <iostream.h>
KHtmlWidget::KHtmlWidget() { KProcess proc;
proc << "ls" << "-l" << "/home"; // bei 'ls' müßte eine Ausgabe erfolgen proc.start(KProcess::NotifyOnExit, KProcess::AllOutput); connect(&proc, SIGNAL(receivedStderr(KProcess *, char *, int)), this, SLOT(getErrors(KProcess *, char *, int))); connect(&proc, SIGNAL(receivedStdout(KProcess *, char *, int)), this, SLOT(getErrors(KProcess *, char *, int)));
}
void KHtmlWidget::getErrors(KProcess *proc, char *buffer, int length) { cout << buffer << "\n"; printf("Hallo Welt\n"); } ...
(Laßt euch durch das KHtmlWidget nicht stören :))
Nur schreibt das Programm weder <buffer> noch "Hallo Welt", also wird die Funktion getErrors() gar erst nicht ausgeführt... Warum???
Du solltest mal die connect's vor das proc.start stellen, ls auf /home hat die dumme Angewohnheit schnell vorbei zu sein. Die Signale von proc verschwinden also im Nirvana, da sie nicht rechtzeitig abgefangen werden.
Konrad
lug-dd@mailman.schlittermann.de