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:

  1. (and that is the hard part) Determine the range of data to be shared with the child
  2. CreateFileMapping in the parent process to share the area from 0.
  3. MapViewOfFile
  4. Launch the child process
  5. In the child process, call OpenFileMapping() to connect to the data area from the parent process.
  6. Fix up any cached values that need changing after a fork(), for example $$

2 Comments

I think $$ was only recently changed to no longer be cached.

And this is incomplete in other ways. What about the parent’s environment? Its open file handles? I’m sure there are a couple more things.

But it may well be possible to tick all the boxes. It’ll just take more work to emulate fork sufficiently completely.

I think this could be prototyped as an XS module?

Leave a comment

About Max Maischein

user-pic I'm the author of various CPAN modules. I'm also one of the admins of perlmonks.org.