Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Re^8: killing threads inside forks

by mojo2405 (Acolyte)
on Aug 22, 2013 at 14:50 UTC ( #1050537=note: print w/ replies, xml ) Need Help??


in reply to Re^7: killing threads inside forks
in thread killing threads inside forks

Hi, So, I'm attaching my code. The code create 3 sons (with fork). Then each son create 3 grand sons (with thread). What I'm failing to do is to send to a son (started with fork) a USR1 signal , which will make all its grand sons to exit immediatly (and not wait to the grand sons to exit after they finish their work). I want to send the USR1 signal from outside to the son PID. I know there is a limitation and I might can not do that, but do other here another clean way to exit threads of the son immediatly when son gets USR1 signal ? Thanks ! Here is the code , the goal is to make the threads to exit while sleep function starting :

#!/usr/bin/env perl use threads; ##kill -10 handle $SIG{USR1}=\&usr_kill_handler; my @sons = ("Son1","Son2","Son3"); my @childs = (); #Start fork foreach my $son (@sons){ my $pid = fork(); if ($pid) { # parent push(@childs, $pid); }elsif($pid == 0) { # child my $results = new testProcess($son); exit 0; }else { print "\nerror : couldnt fork: $!\n"; exit 1; } } #Wait for to end foreach my $child (@childs) { my $tmp = waitpid($child, 0); print "\ninfo : done with pid $tmp\n"; } sub usr_kill_handler{ #Send SIGUSR1 to all childs (started with fork) kill SIGUSR1 => @childs; print "\n\n Stoped due to user request!\n\n"; #Wait to all childs to exit foreach my $child (@childs) { my $tmp = waitpid($child, 0); print "\ndone with pid $tmp\n"; } # After all child ended kill father exit 1; } package testProcess; sub new{ my $class = shift; my ($son) = @_; ##kill -10 handle $SIG{USR1}=sub { print "\n Got signal to son $son with pid ".$$." \n"; threads->exit; }; print "\nSon $son with PID ".$$." Started\n"; my %hash_results = (); my @grand_sons = ("Grand son 1","Grand son 2","Grand son 3"); my @threads = (); #Start new thread foreach my $grand_son (@grand_sons){ my $t = threads->create (\&start_threads,$son,$grand_son); push(@threads,$t); } my $index=0; foreach my $thread (@threads) #wait for all threads untill the end + and insert results to hash { $hash_results{$index}=$thread->join; $index++; } print "\nSon $son with PID ".$$." Finished\n"; } sub start_threads{ my ($son,$grand_son) = @_; print "\nSon $son grand son $grand_son started\n"; my $random_number = int(rand(100)); my $msg = "Son $son grand son $grand_son returns random number $ra +ndom_number"; print "\n$msg\n"; sleep 100; return $random_number; } 1;


Comment on Re^8: killing threads inside forks
Download Code

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (3)
As of 2014-07-29 04:03 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (211 votes), past polls