I'm having some difficulty with a program that establishes a database handle and then forks. When the child process exits, the database handle disconnects. Here's a conceptual example:
#!/usr/bin/perl
use strict;
use MyDBH;
my $dbh = MyDBH->new();
print "Ping: ", $dbh->ping(), "\n";
my $kidpid = fork();
if ($kidpid == 0)
{
# child process
print "Hello world from $$!\n";
exit;
}
# parent process
print "Spawned child process: $kidpid\n";
print "Ping: ", $dbh->ping(), "\n";
Output looks like this:
Ping: 1
Hello world from 7022!
Spawned child process: 7022
Ping:
I think what's happening here is that the database handle's destructor is being called when the child process exits. If I replace the exit() call in the child with an exec() of something, the child process is replaced in memory and the destructor is never called. That seems kind of kludgey to me though, and I'm wondering if there's some other way around this. Is there any other way I can remove the object from the child's space or prevent the destructor from being called? I realize I can disconnect the handle prior to forking and the reestablish it, but I'm hoping there's a cleaner solution.