PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bestimmte Ausgabe von wget als Variable benutzen



xmarvel
13-09-2002, 11:26
hi


Ich programmiere in C. Jetzt führe ich in C den Befehl:
system("wget www.google.de"); aus. Jetzt will ich 1. wissen wann der download zu Ende ist und 2. den Status wie weit er schon fortgeschritten ist.
Die Ausgabe von wget sieht ja wie folgendermaßen aus
--12:01:58-- http://www.google.de/
=> `index.html'
Auflösen des Hostnamen »www.google.de«.... fertig.
Verbindungsaufbau zu www.google.de[216.239.55.100]:80... verbunden.
HTTP Anforderung gesendet, warte auf Antwort... 200 OK
Länge: 3,326 [text/html]

100%[====================================>] 3,326 19.57K/s ETA 00:00

12:01:59 (19.57 KB/s) - »index.html.2« gespeichert [3326/3326]
deswegen brauche ich nur die letzten beiden Zahlen. Also beim Beispiel wäre es [3326/3326]. Das Problem ist ja das die Ausgabe auf dem Bildschirm ist und nicht in mein Programm ? Wie kriege ich jetzt die beiden Zahlen als Variable ?

MFG
xmarvel

TheDodger
13-09-2002, 12:40
Original geschrieben von xmarvel

Die Ausgabe von wget sieht ja wie folgendermaßen aus
--12:01:58-- http://www.google.de/
=> `index.html'
Auflösen des Hostnamen »www.google.de«.... fertig.
Verbindungsaufbau zu www.google.de[216.239.55.100]:80... verbunden.
HTTP Anforderung gesendet, warte auf Antwort... 200 OK
Länge: 3,326 [text/html]

100%[====================================>] 3,326 19.57K/s ETA 00:00

12:01:59 (19.57 KB/s) - »index.html.2« gespeichert [3326/3326]


und genau da wird dein problem liegen, denn '[3326/3326]' wird erst nach dem erfolgreichem download angezeigt.
(sowas lässt sich idealerweise auch in der bash mitverfolgen ;) )

Zu deinem eigentlichen problem ... hab ich nicht den blassesten schimmer, wie du sowas in C regeln kannst.
Unter QT fängt man sowas mit QProzess ab ...
Aber QT bedingt nunmal C++

xmarvel
13-09-2002, 12:45
lol stimmt ne dann eben die Prozent Angabe. Eine Idee hab ich ja man könnte die Ausgabe in eine Datei schreiben und dann die Datei durchparsen nach dem % und anschließend den Wert abspeichern (Nur der Wert ändert sich ja auch logischerweise). Deswegen ist der Weg naja sagen wir mal bescheiden. ;) Dafür denke ich mal muss es auch ne andere Möglichkeit geben. (Hoff ich)

peschmae
13-09-2002, 13:07
es gibt so nen c befehl mit dem du n programm starten kannst und gleich dazu entweder zum stdin oder stdout eine pipe

aus dem zeugs kannst du dann wie aus ner datei lesen

steht im "Unix - Linux System Programmierung" (Addison Weasley) von H.H, aber das ist bei mir zuhause...

ich schau auf montach mal nach, ok?

MfG Peschmä

P.S. gibts nicht ne art libwget oder so, so dass du aufs parsen des output verzichten könntest?

anda_skoa
13-09-2002, 13:20
libCURL kann so etwas:

http://curl.haxx.se/libcurl/

Ciao,
_

xmarvel
13-09-2002, 16:20
thx @ all

werde mir mal curl anschauen. Mal sehen ob ich das hinkriege.

MFG
xmarvel

xmarvel
13-09-2002, 16:42
Hab jetz curl probiert. Hab erstmal ein Beispiel Code genommen leider kann ich das nicht compilen benutze KDevelop 2.1.
Es kommt immer der selbe Fehler obwohl er die Header Datei findet.
/home/xmarvel/Developer/test/test/main.c:35: undefined reference to `curl_easy_init'
Muss ich beim Compiler noch was einstellen ?

MFG
xmarvel

micha
13-09-2002, 17:19
Hi,

hast Du die libcurl schon in Dein Project eingetragen, damit gegen sie gelinkt wird ?
( irgendwo unter Project->Options->Compilerflags oder so, kann grad nicht nachschauen ).
Linker Flag müsste so aussehen: -lcurl

Gruß micha

anda_skoa
13-09-2002, 17:20
Das ist ein Fehler des Linkers.

Der Pfad wo libcurl.a bzw. libcurls.so ist, muß bei den Linker Option eingetragen sein.

Ciao,
_

Sion
13-09-2002, 17:47
Original geschrieben von peschmae
es gibt so nen c befehl mit dem du n programm starten kannst und gleich dazu entweder zum stdin oder stdout eine pipe

Schau dir mal das Programm ivgetty/IVAM (http://ivam.sourceforge.net/) an, dass macht genau das. Du machst ein fork, biegst die stdin/stdout - pipes (u.A. mit dup2) um und startest in einer der beiden Instanzen wget mittels system ... zumindest habe ich das so in Erinnerung. Aber wie gesagt, schau dir mal den src von ivgetty an, am besten du suchst nach dup2.

Viel Glück ;-)
Bei Problemen meld dich halt wieder

xmarvel
13-09-2002, 18:10
Original geschrieben von Sion


Schau dir mal das Programm ivgetty/IVAM (http://ivam.sourceforge.net/) an, dass macht genau das. Du machst ein fork, biegst die stdin/stdout - pipes (u.A. mit dup2) um und startest in einer der beiden Instanzen wget mittels system ... zumindest habe ich das so in Erinnerung. Aber wie gesagt, schau dir mal den src von ivgetty an, am besten du suchst nach dup2.

Viel Glück ;-)
Bei Problemen meld dich halt wieder

thx werd aber warscheinlich curl nehmen aber ich komm auf dein Angebot zurück. :)

@micha und anda_skoa
thx hat geklappt aber jetzt habe ich eigentlich noch ne doofe Frage wo ich die antwort warscheinlich schon weiss ;) aber wenn das Programm fertig ist und andere User es benutzen wollen brauchen sie dann auch die Devel zu curl ?

MFG
xmarvel

micha
13-09-2002, 19:27
Hi,

das kommt ganz drauf an, wie Du Dein Programm anbietest :D
Aber sollte man es selber kompilieren müssen, dann ja.

Gruß micha

peschmae
14-09-2002, 09:36
eben, das mit dem Pipe - Umbiegen, das macht die Funktion
popen für dich, etwa so:

FILE *dz;

if ((dz = popen(cmdline, "r")) == NULL)
printf("Could not open pipe");

//Lesen mit fread

pclose(dz);


Ich hab damit (natürlich mit "w" stat "r") schon mal von der Sounddevice /dev/dsp auf nen Lame Encoder (stdin) geschrieben. Funzt bestens.

MfG Peschmä

ContainerDriver
27-01-2005, 21:08
Hallo.
Auch wenn der Thread schon etwas älter ist, ist er dennoch recht interessant für mich.
Ich wollte auch wget benutzen um eine HTML-Seite aus dem Internet runterzuladen (libcurl scheint für meine Zwecke geringfügig überdimensioniert zu sein).
Dummerweise funktioniert aber popen bei wget nicht, d.h. es wird wohl ein FILE-Stream geöffnet, allerdings kann man von diesem nicht lesen & die Ausgabe von wget erscheint ganz normal auf dem Terminal.
Hat das bei irgendjmd. schon mal funktioniert?

Gruß, FLorian

EDIT: Ich habe gerade den Befehl curl entdeckt. Zur Not würde es damit auch funktionieren, wget wäre aber vorteilhafter.

peschmae
28-01-2005, 06:29
Wget schreibt nicht auf den stdout sondern auf den Stderr.

MfG Peschmä

ContainerDriver
28-01-2005, 18:58
Wget schreibt nicht auf den stdout sondern auf den Stderr.

MfG Peschmä
Tatsächlich. Da war wohl bei meinen ersten Versuchen die Umleitung von stderr nach stdout falsch.

Vielen Dank!

Gruß, Florian