Verwirrung mit exec
-
ich möchte einen Unterprozess erzeugen und ein Programm/Shellscript starten.
prinzipiell klone ich ja erstmal den aktuellen (Parent-)Prozess mittels fork() und würde im child-prozess das exec aufrufen.
Dabei wird der neue Prozessspeicher über den alten (geklonten) gelegt (es sind also ggf. Reste des alten Prozessspeichers im child vorhanden). wie stelle ich sicher, dass der prozessspeicher für das child ausreicht?die normalen beispiele gehen immer davon aus, dass ich das Unterprogramm beim starten gleich erzeuge.
wie mach ich das erst später im Programmverlauf?
also das Parent-programm stellt erst fest, dass ein unterprozess benötigt wird und ruft dann erst fork mit exec (mit parametern die das Parent ermittelt hat) auf.
wie bekomme ich vor dem Fork heraus, ob ich im parent bin oder nicht? oder kann ich nach dem fork den Prozesspeicher des Childs löschen (reste des Parentprogramms entfernen vor dem exec)?
//Edit: ich habe einen Beitrag gefunden, der system mit "&" verwendet, um das zu realisieren, was ich möchte (Unter-Prozess im Hintergrund starten)
trotzdem würde mich das obige interessieren (falls ich die pid mal benötige)
Gruß Frank
-
frank schrieb:
ich möchte einen Unterprozess erzeugen und ein Programm/Shellscript starten.
prinzipiell klone ich ja erstmal den aktuellen (Parent-)Prozess mittels fork() und würde im child-prozess das exec aufrufen.
Dabei wird der neue Prozessspeicher über den alten (geklonten) gelegt (es sind also ggf. Reste des alten Prozessspeichers im child vorhanden). wie stelle ich sicher, dass der prozessspeicher für das child ausreicht?Warum glaubst Du das tun zu müssen? Zum einen sollten so ziemlich alle Implementierungen von fork() Copy-On-Write verwenden, wodurch mitnichten der gesamte Addressspace kopiert wird, zum anderen gibt es Swap-Speicher, falls der physische Speicher dennoch nicht ausreichen sollte. Und überhaupt, warum musst Du unbedingt vor dem call wissen, ob er genug Speicher hat, wo er das doch auch einfach bei Fehlschlag signalisieren kann (und andere mögliche Fehlerquellen, die Du so oder so nicht ausschliessen kannst).
frank schrieb:
die normalen beispiele gehen immer davon aus, dass ich das Unterprogramm beim starten gleich erzeuge.
wie mach ich das erst später im Programmverlauf?
Hä? Ist doch total egal, wann du den fork-Aufruf machst?!
frank schrieb:
wie bekomme ich vor dem Fork heraus, ob ich im parent bin oder nicht? oder kann ich nach dem fork den Prozesspeicher des Childs löschen (reste des Parentprogramms entfernen vor dem exec)?
Bin es nur ich oder schreibst Du total wirr? Vor dem fork gibt es nur einen Prozess. Du willst überhaupt nichts löschen, das macht wenn dann das Betriebssystem für Dich.
-
forker schrieb:
Warum glaubst Du das tun zu müssen? Zum einen sollten so ziemlich alle Implementierungen von fork() Copy-On-Write verwenden, wodurch mitnichten der gesamte Addressspace kopiert wird, zum anderen gibt es Swap-Speicher, falls der physische Speicher dennoch nicht ausreichen sollte. Und überhaupt, warum musst Du unbedingt vor dem call wissen, ob er genug Speicher hat, wo er das doch auch einfach bei Fehlschlag signalisieren kann (und andere mögliche Fehlerquellen, die Du so oder so nicht ausschliessen kannst).
ist nur eine allgemeine Frage...hatte in vergangenheit schon komische Phänomene, wo ich funktionierende fork/exec-konstrukte in ein bestehendes Programm eingebunden habe (z.b. hängender Parent-Prozess)
forker schrieb:
Hä? Ist doch total egal, wann du den fork-Aufruf machst?!
das weis ich ja nicht...
der Gedanke kam daher, da um den fork herum geprüft wird, ob man sich im Parent oder child befindet...was im rest des Programms ja nicht gemacht wird.
kommt halt drauf an, was vom Parent kopiert wird
z.b. folgendes Konstrukt(pseudocode):
exec() { pid=fork(); switch (pid) { case <0: exit(1);//error case 0: //client { exec(...); exit(1); } default: //parent { //waitpid - wie, dass parent nicht hängt? } } } button_click() { exec(); } void main() { //erstelle gui //gtk-schleife }
forker schrieb:
Bin es nur ich oder schreibst Du total wirr? Vor dem fork gibt es nur einen Prozess. Du willst überhaupt nichts löschen, das macht wenn dann das Betriebssystem für Dich.
ich hatte die befürchtung, dass segmente des Parent-Prozesses im Speicher des Childs zu komischen Phänomenen führen könnten (zugriffsverletzungen, hängender parent, etc)
siehe http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html
alles, was nicht mit der Pid verglichen wird, wird von parent und child ausgeführt...und das soll halt nicht sein...der child soll ein eigenständiges Programm sein (exec halt)Gruß Frank