gpt4 book ai didi

perl - 为什么我的 Perl 程序在 fork 之后不收割子进程?

转载 作者:行者123 更新时间:2023-12-04 22:17:33 24 4
gpt4 key购买 nike

我一直在尝试使用 Perl 编写一个基本的 ping 扫描器供内部使用。由于它扫描 24 位 CIDR 网络,如果脚本在单个线程中运行,则运行时间太长。我曾尝试添加 fork 功能来加快进程,但我的 first attempt 花费的时间几乎相同,因为在任何给定时间只有一个子进程处于事件状态。

我阅读了 perlipc 文档和 Perl Cookbook 中的子进程,并提出了第二个版本:

##Install the CHLD SIG handler
$SIG{CHLD} = \&REAPER;
sub REAPER {
my $childPID;
while (( $childPID = waitpid(-1, WNOHANG)) > 0) {
print "$childPID exited\n";
}
$SIG{CHLD} = \&REAPER;
}

my $kidpid;
for (1 .. 254) {
my $currIP = join ".", (@ipSubset[0,1,2], $_);

die "Could not fork()\n" unless defined ($kidpid = fork);
if ($kidpid) {
#Parent process
#Does nothing
}
else {
#Child process
my $pingConn = Net::Ping->new(); #TCP
say "$currIP up" if $pingConn->ping($currIP);
$pingConn->close();

#Nothing else to do
exit;
}
}

say "Finished scanning $ipRange/24";

当我扫描我的内部网络时,输出是:
$perl pingrng2.pl 192.168.1.1
192.168.1.2 up
5380 exited
192.168.1.102 up
192.168.1.100 up
5478 exited
5480 exited
Finished scanning 192.168.1.1/24

从结果中可以看出,执行成功扫描的线程打印“up”消息,干净地退出并由父进程收割。同时,其他 251 个线程悬空连接到“/sbin/init”,如快速的“ps -ef”列表所示。如果我在退出语句之前的子处理块中添加“打印“子:$currIP 结束\n””,我会在我的 perl 脚本退出后“在”终端上获得剩余 251 个进程的输出。

这里发生了什么?我认为 $SIG{CHLD} 子例程与 waitpid 循环相结合将收割所有子进程并确保系统中没有僵尸/悬空进程。

同时,我还希望能够在任何给定时间运行特定数量的子进程,例如,'n' 个子进程并发运行,每当一个退出时,父进程在需要时启动另一个子进程,但没有更多在任何特定时刻都比“n”个 child 多。这可能吗?如果是的话,我可以获得一些伪代码来帮助指导我吗?

最佳答案

看起来您的父进程在子进程之前完成(因此永远没有机会收获它们)。试试这个:

#!/usr/bin/perl

use 5.010;
use strict;
use warnings;

use Net::Ping;

my @ipSubset = (192, 168, 10);

my $i = 0;
my @pids;
for my $octet (1 .. 254) {
my $currIP = join ".", @ipSubset[0 .. 2], $octet;

die "Could not fork()\n" unless defined (my $pid = fork);

#parent saves chlidren's pids and loops again
if ($pid) {
push @pids, $pid;
next;
}

#child process
my $pingConn = Net::Ping->new;
say "$currIP up" if $pingConn->ping($currIP);
$pingConn->close();
exit;
}

#wait on the children
for my $pid (@pids) {
waitpid $pid, 0;
}

关于perl - 为什么我的 Perl 程序在 fork 之后不收割子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/931234/

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