Einzelnen Beitrag anzeigen

Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
604 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Äquivalent zu fork() unter Windows?

  Alt 3. Mär 2013, 10:30
Da Windows seit Win2000 das POSIX Prozessmodell nicht mehr unterstützt, gibt es keinen 100% Pendant zu fork()
Ehm... ich merke nur mal nebenbei an, dass ich unter Windows 7 das POSIX Subsystem (auch genannt Services for Unix Applications) am Laufen habe, was die Weiterführung des alten POSIX Systems unter Windows 2000 und älter ist. Beide nutzen dabei Funktionalität der Windows NT API, die sich von Windows 2000 bis zu 7 bzw. 8 nicht geändert hat (da Microsoft auch hier auf Abwärtskompatibilität acht nimmt).

Und die API Funktion, um die es hier speziell geht, ist NtCreateProcess (welche auch intern von CreateProcess verwendet wird, aber hier wird noch etwas mehr Verwaltungsaufwand betrieben). Die Deklaration schaut so aus:

Code:
NTSYSAPI
NTSTATUS
NTAPI
NtCreateProcess(
    OUT PHANDLE ProcessHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
    IN HANDLE ParentProcess,
    IN BOOLEAN InheritObjectTable,
    IN HANDLE SectionHandle OPTIONAL,
    IN HANDLE DebugPort OPTIONAL,
    IN HANDLE ExceptionPort OPTIONAL
    );
Der wichtigste Parameter im Zusammenhang mit fork() ist SectionHandle. Möchte man einen neuen Prozess basierend auf einer anderen Executable starten, so gibt man hier das Handle zur gemappten Executable an. Lässt man das jedoch weg, so forkt der Kernel den bei ParentProcess angegebenen Prozess. Im Win32 Subsystem muss man hier jetzt jedoch noch ein paar weitere Dinge machen (so muss man dem Subsystem den neuen Prozess von Hand bekannt machen, damit kernel32.dll, etc. für den neuen Prozess korrekt funktionieren). Seit Windows 2003 wird beim Forken übrigens auch eine Copy-On-Write Semantic für den Addressraum verwendet.

Falls jemand näheres hierzu wissen möchte, der sollte sich das Buch Windows NT/2000 Native API Reference anschauen, dort wird beschrieben, wie man einen Win32 Prozess forkt und was man dabei beachten muss. Was ich bisher jedoch noch nicht herausgefunden habe, ist wie man exec() am geschicktesten implementiert...

Gruß,
Sven
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat