Externes Programm starten und Abarbeitung festellen
-
Hallo,
Ich habe eine generelle Frage zur Ausfuehrung eines anderen Programmes in einem
C Program. Ich befinde mich auf einem Linuxrechner und moechte in einem C
Program per scp ein File von einem anderen Computer herunterladen.Momentan gehe ich dabei so vor, dass ich in meinem Programm execlp() mit scp
und den Parametern aufrufe. Ich benutze Zertifikate und habe somit auch keine
stoerende Passwortabfrage. Da afaik saemtliche exec Derivate den eigenen
Prozess mit dem neu aufgerufenen "ersetzen", mache ich vorher ein fork(). Endet
also in meinem Fall scp, endet auch der Prozess, daher fork().Soweit funktioniert es auch, nun haette ich aber doch gerne eine Bestaetigung,
wann denn zB der Download fertig ist, wann also scp auskopiert hat. Dazu habe
ich verschiedene Ideen, weiss aber nicht welches in so einem Fall der "uebliche
Pfad" ist. Soll ich mit der pid nachpollen, ob sie noch aktiv ist? Gibt es evtl
andere funktionen, die dies leisten koennen, i Ggs zu den exec Funktionen? Oder
geht das auch per Pthreads (unter Linux) und join (aber wuerden die dann nicht
untergehn mit dem Prozess?)?Evtl. kann mir jemand Tipps geben, wie man so einen "externen Aufruf" am besten
in C implementiert?
-
Hat sich erledigt, werde es mit waitpid() versuchen
-
Du kannst auch einfach system( .... ) benutzen (man system).
-
Noch schöner ist popen(...,"r"). Dann kannst du auch die
Meldungen auf stdout deines externen Programmes einlesen.
Das verwende ich eigentlich gerne für so was...
-
Bei allen Systembefehlen aus C++ heraus setzt mir es immer das -c davor, das heißt wenn ich z.B. top -b n1 > blablub aus der Kommandozeile ausgebe, ist alles noch in Ordnung.
Nun das ganze im C++ mit system(), popen() oder exec(), es knallt mir immer ein -c davor und schneidet die Commands ab, bei anderen Anwendungen ist es ganauso.Wenn ich den Ablauf dann beobachte, steht das dann so "sh -c top -b n1 > blablub".
-
Einen externen Prozess auszuführen - sei es mit fork/exec oder system - ist immer problematisch. Der richtige Weg ist, eine richtige API zu verwenden. Das ist zwar mühsamer, aber weitaus robuster und schlanker. Bei scp gibt es sicher auch eine lib, die das macht. Aber das ist nichts für Anfänger.
-
Warum soll das problematisch sein? Macht mein System dauernd, sonst hätt ich nur init.