gpt4 book ai didi

perl - 从 Perl 获取子进程

转载 作者:行者123 更新时间:2023-12-04 02:50:42 25 4
gpt4 key购买 nike

我有一个生成一组 child 的脚本。 parent 必须等待每个 child 完成。

我的脚本执行类似于以下 perl 脚本:

#! /usr/bin/perl
use strict;
use warnings;

print "I am the only process.\n";

my @children_pids;

for my $count (1..10){
my $child_pid = fork();
if ($child_pid) { # If I have a child PID, then I must be the parent
push @children_pids, $child_pid;
}
else { # I am the child
my $wait_time = int(rand(30));
sleep $wait_time;
my $localtime = localtime;
print "Child: Some child exited at $localtime\n";
exit 0; # Exit the child
}
}

foreach my $child (@children_pids) {
print "Parent: Waiting on $child\n";
waitpid($child, 0);
my $localtime = localtime;
print "Parent: Child $child was reaped - $localtime.\n";
}

print "All done.\n";

与我上面提供的代码类似,每个 child 可能需要不同的时间来完成。

问题是当我尝试通过循环子进程 PID 来获取子进程时,最后 foreach块,父级按照子级的创建顺序等待子级。

显然, children 没有按照他们产生的顺序完成,所以我留下了一堆僵尸进程, children 碰巧提前完成了。

在我的实际代码中,这些子进程可能会比彼此提前几天完成,并且周围漂浮的僵尸进程的数量可能会增加数百个。

有没有更好的办法让我收获一组 child ?

最佳答案

如果您的父进程不需要知道其子进程的完成状态,那么您只需设置

$SIG{CHLD} = 'IGNORE';

这将在所有 child 完成时自动收割。

如果确实需要通知子进程完成,则需要设置信号处理程序以获取所有可能的进程
use POSIX ();

$SIG{CHLD} = sub {
while () {
my $child = waitpid -1, POSIX::WNOHANG;
last if $child <= 0;
my $localtime = localtime;
print "Parent: Child $child was reaped - $localtime.\n";
}
};

关于perl - 从 Perl 获取子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10923530/

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