http://qs1969.pair.com?node_id=331217


in reply to Perl forking and shared memory strangeness under Windows

I think you'll find your original program was crashing regardless, you just weren't seeing the error message when the comment was there (i had a similar problem with data after an __END__ token that also hid the error). Can't explain why tho'...

The require trick mentioned above still doesn't solve the following scenario:

use strict; require Win32::MMF::Shareable; $|++; tie( my $share, 'Win32::MMF::Shareable', 'share' ) || die; $share = 'foo'; # do some unrelated forking with $share in scope unless( fork ) { exit 0 } # make sure child exits before continuing sleep 1; # set/get crashes print "----before\n"; $share = 'bar'; my $temp = $share; print "----after\n"; __END__ ----before

- ><iper

use japh; print;

Replies are listed 'Best First'.
Re: Re: Perl forking and shared memory strangeness under Windows
by Roger (Parson) on Feb 23, 2004 at 22:45 UTC
    Hi xiper, as BrowserUk has suggested earlier, there is a problem with forking under Windows. The cure is to create two separate instances of Shareable, one in child and one in parent. So the require should be after the fork. I modified the code to below and it ran without problems.
    use strict; $|++; # do some unrelated forking with $share in scope unless( fork ) { exit 0 } require Win32::MMF::Shareable; tie( my $share, 'Win32::MMF::Shareable', 'share' ) || die; $share = 'foo'; # make sure child exits before continuing sleep 1; # set/get crashes print "----before\n"; $share = 'bar'; my $temp = $share; print "----after\n";

      Yes, but a solution that changes the logic of a program isn't practical. You're effectivly saying that "you can't fork with a tied variable in scope" - even if the child has nothing to do with the tied variable. My point was it isn't always possible (nor should it be) to redesign a program around this 'solution'.

      - ><iper

      use japh; print;