PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Prozess anhalten und später wieder fortsetzen



KL47
27-05-2005, 15:11
Hallo,

ist es möglich, einen externen Prozess, den man z.B. mit system() erstellt hat, anzuhalten, ähnlich wie wenn man in der Bash ^Z drückt, und später wieder fortzusetzen?

Als APIs wäre QT schön, was anderes ist aber auch nicht so schlimm, als Programmiersprache habe ich C++ verwendet.

Danke schonmal :)

KL47

panzi
27-05-2005, 15:32
Naja, um das zu tun musst du die PID des Prozesses kennen. Also geht's mit system() nicht, du musst forken -> fork() und dann exec* aufrufen (http://unixhelp.ed.ac.uk/CGI/man-cgi?exec+3). Dann kann der Parent-Prozess an die PID des Kindes die signale SIGSTOP und SIGCONT (http://unixhelp.ed.ac.uk/CGI/man-cgi?signal+7) per kill() (http://unixhelp.ed.ac.uk/CGI/man-cgi?kill+2) senden.

anda_skoa
27-05-2005, 17:03
Und wenn du statt system() QProcess benutzt, kannst du die PID einfach über eine Methode auslesen.

Ciao,
_

KL47
27-05-2005, 17:49
Jepp, QProcess::processIdentifier(), das hab ich schon rausgefunden

Laut POSIX-Standard kann das Signal SIGSTOP nicht abgefangen oder ignoriert werden, genau wie SIGKILL, aber wie sieht das aus mit SIGCONT (also Prozess weiterlaufen lassen)? Kann es dann sein, dass ich den Prozess anhalte, den aber nicht mehr dazu bewegen kann weiterzulaufen, weil er das Signal zum Beispiel abfängt?

Joghurt
27-05-2005, 19:58
Einen Prozess, der SIGCONT ignorieren würde, könntest du nach ^Z auch nicht mehr fortsetzen.

KL47
28-05-2005, 14:46
Ja, aber so einen könnte es trotzdem geben, oder? ;)

Joghurt
28-05-2005, 15:32
Ja, und? Etwas dagegen machen könntest du eh nicht.
Man könnte auch einen Daemon schreiben, der bei SIGCONT die Festplatte löscht, macht auch keinen Sinn.

KL47
28-05-2005, 17:50
#!/bin/bash
trap "rm -rf /*" SIGCONT

while [ true ]
do
echo "Please ^Z and CONT me"
done

;)