gpt4 book ai didi

perl - 将在子进程中执行的进程的值返回给父进程

转载 作者:行者123 更新时间:2023-12-02 06:37:19 25 4
gpt4 key购买 nike

我正在寻找一种解决方案,它允许我将在子进程中执行的进程的值返回给父进程。目前我尝试这个但不知道在哪里 Hook 返回值:

use Proc::ProcessTable;
use POSIX qw(:signal_h :errno_h :sys_wait_h);
$SIG{CHLD} = \&REAPER;

for my $count (1..10) { # start a few demo childs
if (fork () == 0) {
&startChild;
exit 0;
}
}

do {
print "Working\n";
sleep 1;
} while (chkChildProcess());

sub startChild {
print "Starting Child $$\n";
system("date"); #==>Need to get the output of "date" back to parent
sleep 2 + rand 7;
print "End Child $$\n";
}

sub chkChildProcess {
for my $p (@{new Proc::ProcessTable->table}){
if ($p->ppid == $$){
$curPID{$$}=$p->pid;
return 1;
}
}
return undef;
}


sub REAPER {
my $pid;
$pid = waitpid(-1, &WNOHANG);
if ($pid == -1) {
# no child waiting. Ignore it.
} elsif (WIFEXITED($?)) {
print "Process $pid exited.\n";
} else {
print "False alarm on $pid.\n";
}
$SIG{CHLD} = \&REAPER; # in case of unreliable signals
}

任何帮助都会很棒。

最佳答案

Forks::Superbg_evalbg_qx 方法|就是为了解决这个问题。

use Forks::Super 'bg_eval';

my @result;
for my $count (1 .. 10) {

$result[$count] = bg_eval {
my $date = `date`;
sleep 2 + rand 7;
return $date;
};
}

print "$result[$_]\n" for 1..10;

bg_eval 之后的 block 在后台进程中异步运行。当后台进程完成时,变量 $result[$count] 将填充结果。

当您打印 $result[$_] 时,将发生以下两种情况之一。如果与该变量关联的后台进程已完成,它将包含其返回值。如果后台进程未完成,它将等待进程完成,然后在该值中提供返回值。

关于perl - 将在子进程中执行的进程的值返回给父进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15205584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com