rovf has asked for the wisdom of the Perl Monks concerning the following question:
Problem: My Perl application has signal handlers installed, which logs (if possible) the signal received, and reacts accordingly. Recently I found one case in our logs showing that a SIGHUP was delivered. The application is running using ActiveState Perl 5.14 on (64bit-)Windows 7. I wonder which event might possibly cause the SIGHUP handler being called (aside from the obvious possibility that my application is doing suicide using this signal).
I am aware that on Windows, signal handling is simulated by turning Windows messages are turned into signals. Looking at the source code of Perl, I found indeed 1 case where SIGHUP seems to be generated. I don't understand much about the Windows API, but the code says:
I roughly (and maybe uncorrectly) understand the comment in that closing the console corresponds to SIGHUP. Trying to verify this, I wrote the following small program:BOOL WINAPI win32_ctrlhandler(DWORD dwCtrlType) ... switch(dwCtrlType) { case CTRL_CLOSE_EVENT: /* A signal that the system sends to all processes attached to a + console when the user closes the console (either by choosing the Close com +mand from the console window's System menu, or by choosing the End Task com +mand from the Task List */ if (do_raise(aTHX_ 1)) /* SIGHUP */ sig_terminate(aTHX_ 1); return TRUE;
For example, if I start the program in a console, and type Control-C while the application is sleeping, I see message This seems to be Keyboard interrupt in my logfile. However, if I close instead the console window, the last message in the log is Interrupt handlers registered. I conclude that closing the window, is invoking either SIGKILL or SIGSTOP - different from what I expected. I guess that I misunderstood the meaning of SIGHUP on Windows. Could someone help me here?use strict; use warnings; use Config; BEGIN { open(LOG,">","what_happens.log") or die "$!"; my $ofh = select LOG; $|=1; select $ofh; print LOG "Unbuffered Log\n"; } sub pout { print {$_} @_,"\n" for (*LOG, *STDERR); } END { pout("end handler called"); close LOG; } pout "Started"; my $signum = 0; foreach my $signame (split(' ', $Config{sig_name})) { if ($signum) { pout("Establishing $signame $signum"); $SIG{$signame} = $signame =~ /^KILL|STOP$/ ? 'IGNORE' # According to perldoc perlipc, they + can be ignored, but not trapped : sub { $SIG{$signame} = 'DEFAULT'; + pout("Murdered by signal $signame, default han +dler established"); if ($signame eq 'INT') { pout("This seems to be Keyboard interrupt" +); exit; } else { pout("Suicide"); kill($signum, $$); # proceed with norma +l handling of signal } }; } ++$signum; } pout("Interrupt handlers registered"); sleep(6); pout("Normal exit");
--
Ronald Fischer <ynnor@mm.st>
Ronald Fischer <ynnor@mm.st>
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: SIGHUP delivered on Windows
by BrowserUk (Patriarch) on May 21, 2013 at 13:11 UTC | |
by rovf (Priest) on May 21, 2013 at 13:49 UTC | |
by BrowserUk (Patriarch) on May 21, 2013 at 13:52 UTC | |
by rovf (Priest) on May 21, 2013 at 14:57 UTC | |
by BrowserUk (Patriarch) on May 21, 2013 at 18:37 UTC | |
|
Back to
Seekers of Perl Wisdom