PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Aufruf einer shell (bash) aus applikation



microdigi
06-02-2003, 20:23
Aus meinem qt/kde moechte ich (mit QProcess.....) eine bash aufrufen.
das funktioniert auch so weit ganz gut.
nur - wenn das aufrufende programm weiterlaeuft, und
natuerlich irgendwann verendet, dann reisst es (logischweise) auch die neue bash mit in den abgrund.
nun hab ich ja versucht, mit wait(xxx) zu warten bis die bash echt fertig ist,
aber auch das funktioniert nicht, das aufrufende programm rennt trotzdem weiter.
mit ps -A sehe ich die bash (& eine weitere -defunc-).
das aufrufende programm MUSS erhalten bleiben bis die bash verkuemmert.
muss man beim aufruf der bash noch irgendwelche paras mitgeben?

normalerweise sollte das fuer einen ollen hasen ja kein problem sein,
aber ich hab langsam scheuklappen auf, und spaetestens dann empfiehlt sich
eine umfrage - die wahrscheinlich anda_skoa beantwortet. :D
habt ihr dort eigentlich eine kaffee-kasse?

und dann haben wir hier noch das problem mit den verschiedenen libraries
suse 8.0 ... 8.1 ... usw. aber das steht zunaechst mal aufm anderen blatt.

fuer kurze hinweise jederzeit dankbar zeig sich
digi

d.maggot
07-02-2003, 12:04
Hy,

es gibt auch den spawnl Befehl. Eventuell hilft der weiter. Warscheinlich ist es aber generell so, daß wenn der Elternprozess beendet wird auch der Kindprozess verloren geht.

anda_skoa
07-02-2003, 12:14
@dig: Kannst du vielleicht ein kurzes Beispiel posten?

Wenn der QProcess das processExited() Signal emittet, sollte ansich der aufgerufenen Process beendet sein.

Ciao,
_

microdigi
08-02-2003, 12:33
naverfreilichdoch :)

natuerlich habe ich das beiwerk abgeknipst.
auch sieht der geneigte leser, dass hier schon verschiedene ansaetze
(allerdings mit 'besch..eidenem erfolg', also vergeblich) stattfanden...
auch spawn ("cccc").

es ist natuerlich tatsaechlich so und auch normal,
dass der verendende eltern-prozess (also mein (vor-)programm)
die kinder (also die bash in dem fall) mit in den abgrund reisst.
eigentlich sollte die bash aber nur mit explizit 'exit' verenden,
sie verendet aber sofort. :mad: eben weil mein elter den loeffel abgibt.
eigentlich sollte er warten bis die aufgerufene bash nix mehr sagt.

ich habe das gefuehl, dass ich die entweder mit falschen 'zu'gaben aufrufe,
oder dass ihr irgend ne umgebung nicht passt.
die bash wird ganz kurz aufgerufen, man sieht den text '...have much fun...'.
aber dann ist sie auch schon wieder weg. :(
eben weil der eltern prozess dann die graetsche gemacht hat.

etwas gutes hat die sache doch:
mein bildschirm-monitor macht seit linux 8.1 dank neuem ati driver
glatte 1600 x 1200 x 75.
man kann zwar kaum noch was erkennen, weil alles so klein ist,
aber das wird in erster qualitaet und ohne flimmern angezeigt. :rolleyes:

aloha - digi dankbar fuer einen guten hinweis,
ich schmeiss ja auch ab&zu mal 'nen stein in ander leutz garten :)







#include <stdio.h>
#include <stdlib.h>

#include <qapplication.h>
#include <qfile.h>
#include <qwidget.h>
#include <qstring.h>
#include <qlabel.h>
#include <qprocess.h>
#include <qpushbutton.h>
#include <qmessagebox.h>
#include <wait.h>
#include <unistd.h>

...

// perform the user's REAL TASK:
//
// char command [100];
// sprintf (command, "%s", "ls -la");

// system (command);
QProcess proc;
proc.setArguments ("ls -la");
if ( ! (user_program_result = proc.launch ("/bin/bash", 0)))
{ // could not run the shell,...
// ...report into protocol,...
// ...terminate, no access to the system
#ifdef PROTOCOL_USED
// this user is selected to be reported in administrator's protocol file and...
// ...thereby also in the user's individual protocol file
if ((result = admin_utils->EnterEventInProtocolFiles (SHELL_LOGIN_NO_SPACE_ID))
> USER_MESSAGE_MASK)
{ // protocol file some discrepancy, force an entry
admin_utils->EnterEventInProtocolFiles (SHELL_PROTOCOL_CHECKSUM_PROBLEM_ID);
}
RETURN_VALUE (result); // unsuccessful reported
#endif
}

while (proc.isRunning())
{ user_program_result = user_program_result;
}

/// pid = proc.processIdentifier ();
/// int st;
// waitpid (pid, &st, WIFEXITED);

anda_skoa
08-02-2003, 16:13
Hmm.

Normalerweise macht man einen QProcess am Heap und connected einen Slot auf sein processExited() Signal.

So wie du es machst, kommt er nie in die Eventloop zurück.
Das ist aber bei QProcess essentiell.

Also QProcess mit new am Heap erzeugen, connecten, starten.
Der Slot wird aufgerufen, sobald der Process fertig ist.

Ciao,
_

microdigi
09-02-2003, 15:25
Also QProcess mit new am Heap erzeugen, connecten, starten.
Der Slot wird aufgerufen, sobald der Process fertig ist.


das hab ich mittlerweile auch probiert. war ja eigentlich logisch;
denn welcher affenkopp ausser mir generiert schon eíne shell auf dem stack.
tststs :o

dennoch creiert das biest ueberhaupt kein neues object.
und dann kann ich mir das andere auch schenken :(

na mal nochn bisschen 'rumfummeln'
obwohl's ja eigentlich ganz logisch und einfach sein sollte...

ich denke, da mach ich irgendwie bei mir die logische klappe zu :confused:
soll ja vorkommen...

ich denke, ich werds heute oder spaetestens montag wieder angehen.
bis dahin bin ich fuer hinweise auf meine offensichtliche daemlichkeit hier,
bzw wie mir dabei geholfen werden kann, einfach dankbar.

ps: ich hab auch ne frage an trolls gestellt:
wie kann man files lock machen? nix in docu, nix in libs...
mal sehen was die sagen. es MUSS was geben bei einem multi-task system.

und tschuess biss naeckst taim
aloha - digi

ufg
10-02-2003, 19:47
Hallo microdigi,

wenn ich dich richtig verstehe sollte es für die erste Hälfte ganz einfach so gehen:

system("/home/ufg/verschwinde &");

du kannst dann das Qt-Programm beenden
und das Programm verschwinde läuft weiter (& = im Hintergrund ausführen)
bis es natürlich beendet.

Gruß ufg

microdigi
11-02-2003, 09:41
...ist schon klar...:)
aber das geht am thema vorbei, leider.

ich MUSS den (rudimentaeren) VATERprozess solange ERHALTEN
bis das KIND in den brunnen faellt, d.h. sich verabschiedet.
dann (und NUR DANN) soll/muss der VATERprozess WEITERlaufen - und etwas pipapo machen, bis auch er endlich verschwindet.
also soll der vater gewissermassen ein wrapper sein fuer eine (bash-)shell.
ich bin da noch am ball... das ergebnis wird hier erscheinen. nur wann... :(
aloha - digi :)