我正在编写一个管理多进程的程序。这就是我所做的,而且效果很好!但现在,我想将消息从子进程发送到父进程,反之亦然(从父进程到子进程),你知道最好的方法吗?你知道我所做的是否是我想要的正确方法(从子进程到父进程发送消息、信号或共享内存,反之亦然)?
提前致谢!!
#!/usr/bin/perl -w
use strict;
use warnings;
main(@ARGV);
sub main{
my $num = 3; #this may change in the future (it would be dynamic)
my @parts = (1,4,9,17,23,31,46,50);
my @childs = ();
while(scalar(@parts)>0 || scalar(@childs)>0){
if(scalar(@parts)>0){
my $start = scalar(@childs) + 1;
for($start..$num){
my $partId = pop(@parts);
my $pid = fork();
if ($pid) {
print "Im going to wait (Im the parent); my child is: $pid. The part Im going to use is: $partId \n";
push(@childs, $pid);
}
elsif ($pid == 0) {
my $slp = 5 * $_;
print "$_ : Im going to execute my code (Im a child) and Im going to wait like $slp seconds. The part Im going to use is: $partId\n";
sleep $slp;
print "$_ : I finished my sleep\n";
exit($slp);
}
else{
die "couldn’t fork: $!\n";
}
}
}
print "before ret\n";
my $ret = wait();
print "after ret. The pid=$ret\n";
my $index = 0;
for my $value (@childs){
if($value == $ret) {
splice @childs, $index, 1;
last;
}
$index++;
}
}
}
用杀。如果您在 fork 之前在父级中设置变量,则不需要任何外部选项。
my $parent_pid = $$; # Keep a reference to the parent
my $pid = fork();
if ($pid) {
print "Im going to wait (Im the parent);
my child is: $pid. The part Im going to use is: $partId \n";
push(@childs, $pid);
}
elsif ($pid == 0) {
my $slp = 5 * $_;
print "$_ : Im going to execute my code (Im a child) and Im going to wait like $slp seconds. The part Im going to use is: $partId\n";
sleep $slp;
print "$_ : I finished my sleep\n";
kill 20, $parent_pid # Send a signal to the parent, 20 is SIGCHLD
exit($slp);
}
See perldoc -f kill
有关 Kill 调用的更多详细信息
如果您需要做更复杂的事情,另一种选择是使用POE http://search.cpan.org/~rcaputo/POE-1.293/lib/POE.pm
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)