#!/bin/env perl use 5.010; use warnings; use strict; use Carp; use File::Basename; use IO::Socket; use IO::Select; use IO::File; use POSIX qw{WNOHANG setsid}; use POSIX qw{SIGHUP SIGTERM SIGUSR1}; my $sigset = POSIX::SigSet->new(); # SIGCHLD (17) child-process ended # my $CHLDaction = POSIX::SigAction->new( 'sigCHLD_handler', $sigset, &POSIX::SA_NODEFER ); POSIX::sigaction( &POSIX::SIGCHLD, $CHLDaction ); sub sigCHLD_handler { say "Enter sigCHLD handler"; } say "Perl version: $^V"; my $active_readers = 0; my $current_reader_limit = 10; while (1) { if ($active_readers < $current_reader_limit) { # Launch enough new readers to bring us up to the current limit while ($active_readers < $current_reader_limit) { ++$active_readers; my $service_pid; if ( !defined( $service_pid = fork ) ) { say "Couldn't fork. Exit."; exit; } # CHILD process # elsif ( 0 == $service_pid ) { my $command = "echo Hello from child $active_readers " . 'pid $$'; exec $command; } # PARENT process say "Spawned child $active_readers pid $service_pid" } } sleep; say "Out of sleep, begin reaping"; while ( ( my $kid = waitpid( -1, WNOHANG ) ) > 0 ) { --$active_readers; say "Reaping child process $kid, active readers now $active_readers"; } say "Finished reaping"; }