I'm a fan of the opposite approach - serializing the program's state and launching a new instance which reads it. For one particular application I just had it keep all of it's useful state in /dev/shm (mmapped as a struct), double buffering it on every iteration of the main event loop. Of course that doesn't scale too well if you have dynamic allocations.
This also has the advantage of not requiring platform specific code and being able to create checkpoints and time travel.
This also has the advantage of not requiring platform specific code and being able to create checkpoints and time travel.