Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"
 
PerlMonks  

How to make child to halt its execution and the parent to continue?

by srlbharu (Acolyte)
on Mar 20, 2013 at 12:46 UTC ( #1024510=perlquestion: print w/ replies, xml ) Need Help??
srlbharu has asked for the wisdom of the Perl Monks concerning the following question:

I created child process using fork and I want the child to halt execution and the parent to continue. Is there any handler avaiable in perl 5.6 like SIGSTOP? I have searched everywhere and not been able to find the information.

Below is the code that I tried but ctrl C will stop execution for both the processes

#!/usr/bin/perl use strict; use warnings; $|=1; my $pid = fork; die "Cannot fork: $!" unless defined $pid; unless($pid) { print "Child start\n"; my $end; local $SIG{INT} = sub { $end = 1 }; while(1){ sleep(1); until($end) { print "."; sleep(1); } } exit 0; } print "Parent start\n"; for(my $i = 0; ;$i++){ sleep 1; print "*"; if($i == 10){ kill INT => $pid; } }

Please don't mind if I am wrong in any way, I am quite new to system level programming :-(

Comment on How to make child to halt its execution and the parent to continue?
Download Code
Re: How to make child to halt its execution and the parent to continue?
by kschwab (Priest) on Mar 20, 2013 at 16:24 UTC
Re: How to make child to halt its execution and the parent to continue?
by kschwab (Priest) on Mar 20, 2013 at 18:28 UTC
    Reading your request again, my answer above probably isn't correct. It would allow the child process to run on, but the parent would die. That's usually what people want to do. If you really want the child to die, but the parent to live on through a <Control-C>, you'll want to ignore SIGINT in the parent. Your code, with SIGINT being ignored in the parent. Also changed so that the parent prints 'P' and the child prints 'C', so it's more clear. Since the parent is ignoring SIGINT, you'll have to kill this from another window, or try <Ctrl-\>, which sends SIGQUIT.
    #!/usr/bin/perl use strict; use warnings; $|=1; my $pid = fork; die "Cannot fork: $!" unless defined $pid; unless($pid) { print "Child start\n"; my $end; local $SIG{INT} = sub { $end = 1 }; while(1){ sleep(1); until($end) { print "C"; sleep(1); } } exit 0; } # ingore the SIGINT in the parent $SIG{INT} = 'IGNORE'; print "Parent start\n"; for(my $i = 0; ;$i++){ sleep 1; print "P"; if($i == 10){ kill INT => $pid; } }

      Hi Sir,

      This is the exact scenario what am I looking for. It is working exactly as I want.

      Thanks a lot, great relax for me :-)

      A small add on

      In the current example, parent is sending sigal after 10 seconds and then child was killed. Instead, Child needs to send a flag once its execution completes and once the flag is received in parent then it should send the Signal SIGINT to Child. As I know, to achieve this, we need to use IPCs like IPC::Sharable but pel 5.6 doesnot support it. Can you please let me know if any alternative way to do so?

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1024510]
Approved by vinoth.ree
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others musing on the Monastery: (10)
As of 2014-11-28 11:11 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My preferred Perl binaries come from:














    Results (196 votes), past polls