http://www.perlmonks.org?node_id=419058

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
#!/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" }