system & kill



  • Hi,

    würde gerne von meiner C++ Anwendung heraus eine externe Anwendung starten und davon dann wiederum z.B. die ProzessID intern speichern um auf Wunsch die zuvor geöffnete Anwendung wieder zu starten.
    Auf die gestartete Anwendung soll weder gewartet werden, noch soll sie ein ChildProcess sein o.ä..

    Nun hoffte ich eigentlich, dass es eine Möglichkeit gibt, z.B. mit dem char * cmd="./externes_programm &";
    und system(cmd); oder mit einer der Alternativen wie exec die Anwendung und damit einen Prozess zu starten, wobei irgendwie (<-- daran scheitert es derzeit) die PID festgestellt werden müsste. Anderenfalls kann ich sie später nicht verwenden, um den Prozess z.B. mit kill #PID zu beenden.

    Könnt Ihr mir bitte Tipps geben, wie sich das am Besten umsetzen lässt?

    Danke schonmal.
    Schönen Tag noch.



  • system - Aufrufe sollte man eigentlich nur verwenden, wenn es nicht anders geht.
    Welche Plattform verwendest du denn?



  • Welche Plattform verwendest du denn?

    linux. es muss auch nicht unter win funktionieren...



  • Du könntest den Prozess forken und danach den Kindsprozess mit exec überlagern.



  • Hab mal ein einfaches Bsp. mit dem ls Tool, was natürlich ohnehin gleich wieder geschlossen wird. Aber bei Anwendungen, die "an" bleiben, ist selbiges zu beobachten:

    char *Env_argv[] = { "/bin/ls", "-l", "-a", (char *) 0 };
    	pid_t pID = fork();
    	int execReturn = execve (Env_argv[0], Env_argv, 0);
    	std::cout << "\nPID                           " << pID;
    

    Es wird zu keinem Zeitpunkt die cout Ausgabe angezeigt 😞
    Kann folglich schlecht feststellen, ob eine pID abgelegt wird. Nehme aber eher an.
    Was ist denn falsch daran?



  • Exec ersetzt das laufende Programm durch das angegebene, d.h. das Programm erreicht die Zeile danach nie mehr. Aber dafür hast Du die ls-Aufgabe doppelt, da der Prozess ja geforkt wurde, ist doch auch nett 😉

    Du musst nach fork den Rückgabewert prüfen: ist er == 0, so bist Du im Kindprozess und kannst exec() durchführen, ist er > 0, dann bist Du im Elternprozess und dies ist die PID des Kindes, die Du speichern willst.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten