elwarren has asked for the wisdom of the Perl Monks concerning the following question:
I've used the Net::DNS::Nameserver module to run a local nameserver on my windows workstation. After teaching it a few tricks and getting it to do what I want, I thought I would get fancy and have it register itself as my dns server. Win32::Ipconfig does this very nicely.
I store my current dns servers in a hash then set my adapter to use my local nameserver. When my server stops, I set the adapter back to the servers I saved. I put this step in the END block, but it doesn't seem to get called when I CTRL-C. In fact, nothing happens when I hit CTRL-C when I set my own signal handler.
After much gnashing of teeth and blaming signal handling on windows, I realized that Net::DNS::Nameserver must be handling signals in its own loop. I was hoping that the END in my code would execute after the modules cleanup, but it doesn't seem to be.
My question is simply, can I catch CTRL-C and cleanup, or somehow make sure my end code always runs? I have put together a small example below to illustrate the problem.
TIA
I store my current dns servers in a hash then set my adapter to use my local nameserver. When my server stops, I set the adapter back to the servers I saved. I put this step in the END block, but it doesn't seem to get called when I CTRL-C. In fact, nothing happens when I hit CTRL-C when I set my own signal handler.
After much gnashing of teeth and blaming signal handling on windows, I realized that Net::DNS::Nameserver must be handling signals in its own loop. I was hoping that the END in my code would execute after the modules cleanup, but it doesn't seem to be.
My question is simply, can I catch CTRL-C and cleanup, or somehow make sure my end code always runs? I have put together a small example below to illustrate the problem.
TIA
#!/usr/bin/perl use warnings; use strict; use Net::DNS; use Net::DNS::Nameserver; sub replyhandler { 1 } sub gotint { my $sig = shift; die "die because I caught: SIG<$sig>\n"; } #$SIG{'INT'} = \&gotint; my $ns = Net::DNS::Nameserver->new( LocalAddr => '127.0.0.1', ReplyHan +dler => \&replyhandler); $ns->main_loop; while ( 1 ) { sleep 1 } END { print "oh no this is the END\n" }
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: Cleaning up after CTRL-C when using Net::DNS::Nameserver on Windows?
by jfroebe (Parson) on Jan 03, 2005 at 21:42 UTC | |
by elwarren (Priest) on Jan 04, 2005 at 20:12 UTC | |
Re: Cleaning up after CTRL-C when using Net::DNS::Nameserver on Windows?
by sgifford (Prior) on Jan 04, 2005 at 03:00 UTC |
Back to
Seekers of Perl Wisdom