Hallo,
zu dem oben genannten Thema ist mir vor kurzen was gutes eingefallen: Ich kann mir vorstellen das es möglich ist das Pärchen fork/exec in der libc recht brauchbar zu emulieren. Der fork-Stub müsste dafür nur eine Kopie des aktuelles Stacks anfertigen und ein Flag setzen, alle weiteren Aufrufe in die libc welche File-Handels u.ä. betreffen müssten dann mit einem zweiten Datensatz bearbeitet werden (deswegen das Flag) und die exec-Funktion müsste dann einen neuen Prozess erzeugen und den geänderten zweiten Handle-Datensatz dem neuen Prozess geben und als letztes im eigenen Prozess den alten Stack restaurieren um damit wieder aus dem fork-Aufruf zurück zu kommen (mit dem passenden Return-Wert für den Eltern-Prozess). Mir ist klar dass das nicht immer funktioniert, spätestens wenn zwischen fork und exec die beiden Prozesse miteinander kommunizieren wollen geht das mit meiner Idee nicht weil der neue Prozess ja erst bei exec erstellt wird und der Code zwischen fork und exec noch im alten Prozess läuft während der eigentliche Ausführungspfad des alten Prozesses noch nicht ausgeführt wird. Das das nur mit Single-Thread-Programmen funktioniert ist auch klar aber wer Threads benutzt benötigt IMHO auch kein fork.
Es ist offensichtlich das dieser dirty Hack in einigen Situationen nicht das tut was unter POSIX passieren würde und es da eine Menge Risiken gibt, z.B. könnten andere statische Variablen zwischen fork und exec manipuliert werden und diese Manipulation wäre dann im Elternprozess sichtbar (sie passiert ja auch noch im Elternprozess) obwohl das eigentlich nicht sein darf. Trotzdem könnte diese Krücke für viele einfache Programme durchaus brauchbar sein. Es würde einem zumindest ersparen beim Portieren eine Menge Code anzufassen obwohl da nur nach klassischer POSIX-Manier neue Prozesse erstellt werden. Ich hab noch nicht nachgesehen aber ich kann mir vorstellen das damit über 90% aller fork-Aufrufe in den Core-Utils gut abgedeckt wären und man sich so eine Menge Portierungsaufwand erspart. Da man diese Funktionalität nur dann in der libc bräuchte wenn es sich um ein POSIX-Programm handelt sollte das ganze eventuell über ein #define zuschaltbar sein bzw. die libc müsste doppelt vorhanden sein damit dann der Loader die jeweils passende benutzen kann.
Ich hoffe ich habe meine Idee verständlich ausgedrückt ansonsten Bitte nachfragen.
Was haltet Ihr von meiner Idee?
Seht Ihr irgendwelche Probleme oder Lücken (aus Sicht der einfachen Standard-Fälle)?
Grüße
Erik
zu dem oben genannten Thema ist mir vor kurzen was gutes eingefallen: Ich kann mir vorstellen das es möglich ist das Pärchen fork/exec in der libc recht brauchbar zu emulieren. Der fork-Stub müsste dafür nur eine Kopie des aktuelles Stacks anfertigen und ein Flag setzen, alle weiteren Aufrufe in die libc welche File-Handels u.ä. betreffen müssten dann mit einem zweiten Datensatz bearbeitet werden (deswegen das Flag) und die exec-Funktion müsste dann einen neuen Prozess erzeugen und den geänderten zweiten Handle-Datensatz dem neuen Prozess geben und als letztes im eigenen Prozess den alten Stack restaurieren um damit wieder aus dem fork-Aufruf zurück zu kommen (mit dem passenden Return-Wert für den Eltern-Prozess). Mir ist klar dass das nicht immer funktioniert, spätestens wenn zwischen fork und exec die beiden Prozesse miteinander kommunizieren wollen geht das mit meiner Idee nicht weil der neue Prozess ja erst bei exec erstellt wird und der Code zwischen fork und exec noch im alten Prozess läuft während der eigentliche Ausführungspfad des alten Prozesses noch nicht ausgeführt wird. Das das nur mit Single-Thread-Programmen funktioniert ist auch klar aber wer Threads benutzt benötigt IMHO auch kein fork.
Es ist offensichtlich das dieser dirty Hack in einigen Situationen nicht das tut was unter POSIX passieren würde und es da eine Menge Risiken gibt, z.B. könnten andere statische Variablen zwischen fork und exec manipuliert werden und diese Manipulation wäre dann im Elternprozess sichtbar (sie passiert ja auch noch im Elternprozess) obwohl das eigentlich nicht sein darf. Trotzdem könnte diese Krücke für viele einfache Programme durchaus brauchbar sein. Es würde einem zumindest ersparen beim Portieren eine Menge Code anzufassen obwohl da nur nach klassischer POSIX-Manier neue Prozesse erstellt werden. Ich hab noch nicht nachgesehen aber ich kann mir vorstellen das damit über 90% aller fork-Aufrufe in den Core-Utils gut abgedeckt wären und man sich so eine Menge Portierungsaufwand erspart. Da man diese Funktionalität nur dann in der libc bräuchte wenn es sich um ein POSIX-Programm handelt sollte das ganze eventuell über ein #define zuschaltbar sein bzw. die libc müsste doppelt vorhanden sein damit dann der Loader die jeweils passende benutzen kann.
Ich hoffe ich habe meine Idee verständlich ausgedrückt ansonsten Bitte nachfragen.
Was haltet Ihr von meiner Idee?
Seht Ihr irgendwelche Probleme oder Lücken (aus Sicht der einfachen Standard-Fälle)?
Grüße
Erik

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken

Gespeichert
SCNR)
