• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[Gelöst] Programm starten und beobachten

Hallo!

Ich möchte aus einem C++-Programm heraus ein anderes Programm starten. Bisher hab ich das mit system() gemacht. Allerdings hängt mein Programm dann fest bis das andere Programm beendet ist. Ich möchte das so machen das das Programm gestartet wird und wenn es nach 5 min sich noch nicht selber beendet hat soll mein C++ das Ding abschießen. Irgendeine idee? Ich dachte daran einen neuen Thread zu erstellen und von dort aus mit system() das Programm zu starten. Nur wie komme ich dann an die PID um das Programm ggf. selber abzuschießen?
 
Benutze fork(). Der Returnwert von fork im Elternprozess ist die PID des Kindprozesses. Im Kindprozess kann dann mittels execl() (oder anderern Aufrufen der exec-Familie) das gewünschte Programm gestartet werden:

Code:
pid = fork();
if (!pid) {
  // Kindprozess, wird durch "blah" ersetzt
  execl("blah","blah", arg1, arg2, ...);
}
// Elternprozess, pid= PID des Kindprozesses.

Überwachen von Kindprozessen ist dann mittels wait(), waitpid() oder waitid() möglich.
 
Vielen Dank! Ich habe mir jetzt ein kleines Tool geschrieben, dass ein anderes Programm nach einer bestimmten Zeit ggf. abschießt.

Code:
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(int argc,char** argv)
{
	if(argc < 3) {
		printf("Nicht genügend Argumente!\n");
		return 4;
	}
	pid_t pid;
	int status;
	pid = fork();
	if (pid < 0) {
		printf("Fehler : fork () lieferte %u.\n", pid);
		exit(1);
	} else if (pid == 0) {
		execv(argv[1], &argv[3]);
		exit(3);
	} else {
		int timer = atoi(argv[2]);
		while((pid = waitpid(-1, &status, WNOHANG)) == 0) {
			sleep(1);
			if(timer < 0) {
				kill(pid,SIGKILL);
				//Benutzer benachrichtigen
			}
			timer--;
		}
		if(WIFEXITED(status) != 0)
			return status;
		else
			return 2;
	}
	return 0;
}
 
Oben