Seite 1 von 1

QThread + execv

Verfasst: 11. April 2007 00:18
von andy72
Hi,

ich habe eine grundsätzliche Frage zu QThread bzw execv(const char*, const char*):

Ich möchte gerne einProgramm aus meiner Anwendung heraus starten, ohne, dass meine Anwendung dabei blockiert wird oder sonst was.
Mein Lösungsansatz ist wie folgt:

Ich habe eine Klasse von QThread abgeleitet, in der die Funktion "run()" implementiert wird, und darin die funktion execv() ausführt.

Aufgerufen wird das ganze von einem Button in einem Widget, der bei Mouseclick den Thread anstösst (mit start() ).

Nun mein Problem:
Das ganze funktioniert soweit, dass meine Anwendung normal reagiert, wenn der Thread gestartet ist, jedoch wenn ich die Anwendung aus dem Thread 2x gestartet habe, beendet sich meine (Haupt-)Anwendung selbst,
die in einem X-Server läuft und Probehalber mit "exec anwendung" in ~/.xinitrc gestartet wurde.

Liegt das Problem in xinitrc, sollte ich keinen Thread verwenden oder habe ich einenkompletten Denkfehler ??? :D

Bin für jede Hilfe dankbar :)
LG
Andy

Verfasst: 11. April 2007 08:43
von upsala
Btw. was kann execv, was QProcess nicht kann? Außerdem warum sollte deine Anwendung blockiert werden, wenn du eine andere startest?

Verfasst: 11. April 2007 10:51
von andy72
Nun, egal, was ich bisher probiert habe - meine Anwendung beendet sich nach beenden des neuen Prozesses ständig selbst, und ich finde den Fehler nicht. Habe es mit execv, execl, execp und auch mit QProcess probiert, jedoch habe ich überall den selben Effekt

Verfasst: 11. April 2007 12:12
von upsala
Beendet sich deine Anwendung regulär oder wird sie durch einen Fehler beendet?

Verfasst: 11. April 2007 12:48
von andy72
Meine Anwendung beendet sich selbst ohne Fehler durch Qt, ohne Fehler des X-Servers (Version Xorg 7.1.1) und ohne coredump.

Ich vermute schon fast, dass ich die ~/.xinitrc falsch habe, denn die main.cpp ist auch ganz normal aufgebaut.

Meine Anwendung startet mit

Code: Alles auswählen

#!/bin/sh

export PATH=$PATH:$HOME/bin

exec myprog

Verfasst: 11. April 2007 12:54
von upsala
Wenn sich deine Anwedung regulär beendet, dann würde ich mal nachschaun wer deiner Event-Loop mitteilt, daß sie sich zu beenden hat. exec & Co machen das nämlich nicht...

Verfasst: 11. April 2007 17:29
von andy72
Hm,habe den Fehler gefunden ... QProcess brachte doch einen Fehler:
"Process Destroyed, already running".

Habe herausgefunden, dass man das QProcess-Object mit "new" erstellen muss, sonst nimmt er den Parent-Process, der natürlich schon läuft :D

...warum aber execv & co meine Anwendung killt, bleibt trotzdem ein Geheimnis, aber egal, mit QProcess geht es jetzt *g*

Danke für die Hilfe :)

*Thema hiermit beendet*

Verfasst: 12. April 2007 13:54
von RHBaum
Wir beschreiben nun eine ganze Klasse von ähnlichen Systemaufrufen, die exec-Familie. Sie dienen dazu, ein auf einem File stehendes Programm zu laden und auszuführen. Das aufrufende Programm beendet seinen Ablauf mit dem exec. Dabei entsteht kein neuer Prozeß. Vielmehr wird der einen exec-Call ausführende Prozeß durch den durch die Ausführung des angegebenen Programmes entstehenden Prozeß überlagert. Die Prozeß-Id bleibt dieselbe.
Das verhalten ist korrekt. Exec? ueberlagert deinen Prozess. zu deinem prozess gehoeren auch alle deine threads.

Wolltest du das verhindern, und das Programm parallel starten, muesstest du zuerst nen neuen Prozess erzeugen (fork/CreateProcess) und den neuen Prozess mit dem exec uerberladen.

QProcess macht intern auch genau dies ....
Gibt aber unter linux system calls die Dir fork und exec auch gleich tun ...

ciao ...

Verfasst: 15. April 2007 19:08
von andy72
Ja, habe das mit der exec-familie wohl falsch verstanden. Meine Anwendung erlaubt nun,einen Prozess wie gewünscht mit QProcess zu starten, und ichkann mittels weiterer Mechanismen auch auf die gestartete Anwendung einfluss nehmen :)

LG
Andy