Überprüfen, ob ein Prozess läuft!
-
Hallo,
ich hab mal eine Frage. Und zwar möchte ich gerne unter Linux mit Hilfe von C++ überprüfen, ob ein bestimmter Prozess im Hintergrund noch aktiv ist. Ich hab sowohl den Namen des Prozesses, also auch die ProzessID (pid).
Ich habe mich schonmal etwas schlau gemacht und herausgefunden, dass man mit system(ps -ef | grep Prozessname oder id ...) herausfinden könnte, ob der Prozess läuft.
Aber gibt es da nicht eine einfachere Möglichkeit über einen Systemaufruf??
Danke schonmal!
Mit freundlichen Grüßen
Soque
-
ps liest alle informationen über /proc aus. für jeden prozess wird dort ein ordner mit der pid des prozesses als name erstellt. existiert der ordner, existiert auch ein prozess mit dieser id. ob das der richtige ist, kannst du anhand des links "exe" in diesem ordner prüfen. er zeigt auf die exe-datei des prozesses.
-
naja, du hättest noch die Möglichkeit das ganze über popen() zu machen, allerdings öffnest du ja bei popen() trotzdem den neuen Prozess und machst keinen system-call an sich (also eigentlich schon, aber net so, wie du willst, denk ich ma)
-
Hey, hey
danke schonmal, dann müsste ich ja nur im /proc Verzeichnis überprüfen, ob dort ein bestimmter Ordner existiert. Ich dachte zwar, dass es dafür irgendein Systemaufruf gibt, aber so geht es auch erstmal
Danke!
Mit freundlichen Grüßen
Soque
-
mir ist kein syscall vom typ "process_exists(pid)" bekannt. man kann durch geschicktes verwenden von waitpid bzw. waitid auch testen, ob ein kindprozess existiert. das geht aber eben nicht für beliebige prozesse.
-
namenlos schrieb:
mir ist kein syscall vom typ "process_exists(pid)" bekannt. man kann durch geschicktes verwenden von waitpid bzw. waitid auch testen, ob ein kindprozess existiert. das geht aber eben nicht für beliebige prozesse.
Man kann, wenn die PID bekannt ist, einen kill() mit Signal 0 absetzen. Der Prozess erhält dann kein Signal, aber kill() macht die normalen Fehlerprüfungen, gibt also -1 (errno == ESRCH) zurück, wenn der Prozess nicht existiert. Es muss dem Benutzer allerdings erlaubt sein, Signale an den Prozess zu schicken, sonst gibt's errno == EPERM.
man kill schrieb:
If sig is 0, then no signal is sent, but error checking is still performed.