Hi Leute,
Ich habe die Lösung für Precesse die über "sh" laufen. Deshalb habe ich mir vorgenommen eine kleine FAQ zu schreiben.
Als erstes müssen Sie ein paar Dateien includieren:
Code:
#include <sys/types.h>
#include <signal.h>
Jetzt braucht man ein Slot, der augerufen wird, wenn das Process beendet werden soll.
Code:
void processDlg::startKillProc()
{
pidList = QStringList();
// so säubern Sie QStringList
int i = proc->processIdentifier();
// so bekommt man PID (Process Indentifikationsnummer)
QString Pid; Pid.setNum( i );
// Nummer in string umwandeln
killStr = QString( "ps --ppid %1 -o pid" ).arg( Pid );
// killStr ist ein string
// "ps --ppid %1 -o pid" zeigt alle Processe an, die erstellt wurden unter dem sh bzw. bash
killProcess = new QProcess( this );
killProcess->clearArguments();
// argumente löschen (sinvoll wenn man kill mehrmals ausführen will)
killProcess->addArgument( "sh" );
// killProcess wird später alle PIDs ausgeben die wir töten wollen ;)
killProcess->addArgument( "-c" );
killProcess->addArgument( killStr );
connect( killProcess, SIGNAL( readyReadStdout() ),
this, SLOT( readKillProcOut() ) );
connect( killProcess, SIGNAL( processExited() ),
this, SLOT( killStartedProcess() ) );
killProcess->start();
}
So jetzt brauchen Sie die Ausgabe, die killProcess macht:
Code:
void MyApp::readKillProcOut()
{
pidList << killProcess->readStdout();
// pidList ist eine QStringList. Die nimmt alle Ausgaben von killProcess auf.
}
Sobald killProcess beendet ist wird dieses Slot ausgeführt:
Code:
voidMyApp::killStartedProcess()
{
pidList.gres( "PID", "" );
// Damit löscht man das wort "PID" aus der liste (Sie brauchen nur zahlen)
for ( QStringList::Iterator it = pidList.begin(); it != pidList.end(); ++it )
// nun werden alle PIDs nach einander aufgeruffen
{
QString num = *it;
// Ein neues string zu erstellen ist (glaube ich) nicht notwändig,
//aber ich habe es so gemcht.
if ( !num.isEmpty() )
// erste Linie in der liste ist lehr, nach dem Sie das Wort "PID" gelöscht haben,
// also überspringt das probramm alle lere Strings.
{
int ProcID = num.toInt();
// QString in nummer umwandeln.
kill( ProcID, 9 );
// Unterprocess beendet :-D. Bleibt nur noch Hauptprocess...
}
}
int i = proc->processIdentifier();
// PID wieder abfragen
kill( i, 9 );
// und töten
//Den hauptprocess kann man auch über proc-> kill(); töten,
//ist aber nciht empfohlen, da es zum Abstürz führen kann (genau so war es bei mir).
delete killProcess;
// natürlich den Process löschen, sonst kann es zum Abstürz führen!
}
Hoffentlich hilft diese FAQ jemandem.
chapaev
Lesezeichen