2016-07-21 5 views
0

Ich versuche ein Shell-Skript über eine Qt-GUI aufzurufen, aber nach dem Ausführen des Skripts bleibt die bash-Sitzung geöffnet, wenn sie fertig sein soll.Qt QProcess startDetached kann den Prozess nicht beenden (bash session)

diesen Code zu haben:

QString s = "./script.sh " + argument; 
qint64 *pid = NULL; 
QProcess process; 
process.startDetached("/bin/bash", QStringList() << "-c" << s, NULL, pid); 
bool finished = process.waitForFinished(-1); 
std::cout << "ended"; 

So, nachdem das Skript ausgeführt wird, wird ein Befehl erwartet eingegeben werden, kann ich jeden Befehl setzen und es wird sie auszuführen. Das Problem ist, dass es nie endet, bis ich einen Befehl eingegeben habe.

Ich habe auch versucht die s Variable wie folgt ändern:

QString s = "./script.sh " + argument + " ;exit"; 

der Hoffnung, dass es die Bash-Sitzung enden würde, aber nichts passiert.

Wenn ich anstelle der Funktion startDetachedstart verwende, wird die Bash-Sitzung ohne den Befehl ;exit geschlossen.

Hoffe, dass jemand weiß, wie man es oder ein Workaround löst!

+0

Was ist das Skript und das Argument? Alternativ können Sie dies mit einem Standardbefehl reproduzieren, zB 'bash -c" echo done "'? –

+0

Ein Standard-Befehl wird das gewünschte Verhalten reproduzieren. Das Skript hat 2 Befehle und dann ein 'exit 0', um das Skript zu beenden. Die Befehle werden korrekt ausgeführt. – lpares12

Antwort

0

startDetached() ist eine statische Methode; Sie haben einen neuen Prozess gestartet, der jedoch nicht durch das Objekt process dargestellt wird.

Wenn Sie warten auf process zu beenden, wird es ewig warten, weil process wurde nie gestartet.

Versuchen Sie so etwas wie:

process.start("/bin/bash", QStringList() << "-c" << s); 
bool finished = process.waitForFinished(-1); 

Man könnte ich umleiten möchten/O vor start().

+0

Der ganze Sinn von 'startDetached' besteht darin, den Prozess vom aktuellen Prozess zu starten und abzutrennen, so dass das Warten darauf keinen Sinn ergibt. – hyde

+0

Ja, das war nicht meine Frage. Diese Zeile ist zu Testzwecken da. Meine Frage ist, wie kann ich dafür sorgen, dass der Kindprozess endet, da er in einer Bashsitzung stecken bleibt. Habe auch die start() Methode ausprobiert aber ich brauche sie nicht blockierend. – lpares12

+0

@deuseux, ich verstehe nicht ganz, was Sie zu tun versuchen: 'start()' blockiert nicht; 'startDetached()' erzeugt einen nicht untergeordneten (also nicht-verwertbaren) Prozess. –