in reply to Re: Why is a deeply-bound lexical in a forked closure blocking the parent process?
in thread Why is a deeply-bound lexical in a forked closure blocking the parent process?
I read your response yesterday, and was fairly sure that you had hit the nail on the head. But I wanted to do it justice by testing further, and as I expected, the program succeeds when another reference is created to the filehandle.
First, I made sure $b_use_global_fh was zero, and changed system_command() to return both $psyscmd and the filehandle $fh, so I could create a reference to $fh to keep it open:
That worked exactly as you predicted. It also worked when I simply had the parent process return the filehandle:my ($psyscmd, $fh) = system_command("$bld_cmd 2>&1"); $global_fh = $fh;
but only, of course, when the reference was preserved after the return from monitor_build:if ($pid) { # Parent print STDERR "\e[101m(1a) Parent about to return\e[m\n"; return $fh; }
my $unused_fh = monitor_build("./fakebuild");
So I thank you for a very enlightening solution. It taught me something important about closures; namely, that they close their open filehandles which go out of scope, just the way a program does when it exits. Nicely written!
Update: I just realized (and just tested as correct) that another way to keep the filehandle from attempting to close is for the parent to return the reference to the closure:
Then, as long as it is saved in the main program, this technique works as well. It also avoids having to fuss with the filehandle directly.my $psyscmd = system_command("$bld_cmd 2>&1"); # ... if ($pid) { # Parent print STDERR "\e[101m(1a) Parent about to return\e[m\n"; return $psyscmd; }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^3: Why is a deeply-bound lexical in a forked closure blocking the parent process?
by Anonymous Monk on Feb 24, 2006 at 19:14 UTC |