Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Re: Child process lingers after keyboard interrupt on Windows

by BrowserUk (Patriarch)
on Oct 11, 2018 at 01:03 UTC ( [id://1223843]=note: print w/replies, xml ) Need Help??


in reply to Child process lingers after keyboard interrupt on Windows

The difference is the flags used on the CreateProcess() call underlying the different methods of creating a child process. You cannot change them from your application.

The simplest way for you to ensure your child processes are cleaned up if your parent is interupted is to install a signal handler for each possible interupt signal and use kill to forward the interrupt before allowing the parent to die.


With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority". The enemy of (IT) success is complexity.
In the absence of evidence, opinion is indistinguishable from prejudice. Suck that fhit
  • Comment on Re: Child process lingers after keyboard interrupt on Windows

Replies are listed 'Best First'.
Re^2: Child process lingers after keyboard interrupt on Windows
by toughy (Acolyte) on Oct 20, 2018 at 11:30 UTC

    I believe

            kill 'INT', $pid
    
    will not send a keyboard interrupt to the other process when on Windows. It should kill the process, but it looks to me that will not work either.

    I tried the bellow code in a cmd console and neither the explicit call to kill(), nor the hardware keyboard ^C press were passed on to the child:

    perl -MIPC::Open2 -E "my($pid, $in); $pid = open2('>&' . fileno(STDOUT), $in, 'cmd', '/C', 'PowerShell', '-Command',  'Sleep', '7;', 'Echo', 'Exiting'); $SIG{'INT'} = sub { kill 'INT', $pid if $pid }; sleep 3; $SIG{'INT'}->(); waitpid $pid, 0"
    
    or just the perl code:
        my($pid, $in);
        $pid = open2('>&' . fileno(STDOUT), $in, 'cmd', '/C', 'PowerShell', '-Command',  'Sleep', '7;', 'Echo', 'Exiting');
        $SIG{'INT'} = sub { kill 'INT', $pid if $pid };
        sleep 3;
        $SIG{'INT'}->();
        waitpid $pid, 0
    

    When kill() is invoked 3 seconds after running the above script, nothing happens. When I press ^C (within 7 sec of starting the command), still nothing.

Re^2: Child process lingers after keyboard interrupt on Windows
by Anonymous Monk on Oct 21, 2018 at 07:34 UTC
    How do you forward the interupt?can you show some code?

      The included code:

      $SIG{'INT'} = sub { kill 'INT', $pid if $pid };

      would be the Perl way to forward an interrupt. Except:

      • the INT signal is normally sent to all processes in the group anyway, so you only forward it like this if you know the child went to some other process group already. And then, it probably went away to avoid this kind of interrupt.
      • In a similar way, Windows also sends ^C (Ctrl+C) to all processes attached to that console
      • signals do not really exist on Windows, and there this call to kill directly kills the process, no signal sent whatsoever

      Or at least this is what the documentation says. Because when I try it out, nothing works as it should since I got on Windows...

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1223843]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others goofing around in the Monastery: (4)
As of 2024-04-18 04:15 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found