AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Äquivalent zu fork() unter Windows?
Thema durchsuchen
Ansicht
Themen-Optionen

Äquivalent zu fork() unter Windows?

Ein Thema von Angel4585 · begonnen am 2. Mär 2013 · letzter Beitrag vom 3. Mär 2013
 
Benutzerbild von JamesTKirk
JamesTKirk

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

AW: Äquivalent zu fork() unter Windows?

  Alt 3. Mär 2013, 09: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz