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;
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|