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