A real fork() call could be possible on Windows (XP onwards)
Prompted by BrowserUk in his post on Perlmonks on Win32, fork and XS globals, I looked into the PAGE_WRITECOPY
for CreateFileMapping, and it seems that, in fact, this function, together with a bit of work could be made to implement a (data-)fork call on Windows, with real sharing of identical pages.
There is this sample program on the MSDN, which outlines how to use a mapped view of a file for shared memory IPC, and by using the PAGE_WRITECOPY
flag instead of FILE_MAP_ALL_ACCESS
, we should get COW semantics for the shared area.
The part for implementing fork() would seem to just be:
- (and that is the hard part) Determine the range of data to be shared with the child
- CreateFileMapping in the parent process to share the area from 0.
- MapViewOfFile
- Launch the child process
- In the child process, call
OpenFileMapping()
to connect to the data area from the parent process. - Fix up any cached values that need changing after a fork(), for example
$$