❮ htop
❯
- waitpid
- POSIX
- WNOHANG
Active non-blocking waiting with waitpid
Up till now we were usig the wait function to wait for a child process to terminate. It is a blocking call that will wait till any of the child processes terminates.
There are other options as well. Using the waitpid function you could wait for a specific child to terminate using its PID or you can have a non-blocking way to check if there is any child-processes that has already terminated. The non-blocking wait mode allows the parent process to do other things while waiting for the child processes to do their job.
examples/forks/active_waiting.pl
use strict; use warnings; use Time::HiRes qw(sleep); use POSIX ':sys_wait_h'; main(); sub main { my ($sleep, $exit) = @ARGV; die "Usage: $0 SLEEP EXIT\n" if not defined $exit; my $pid = fork(); die 'Failed to fork' if not defined $pid; if ($pid == 0) { print "Child process PID $$\n"; sleep $sleep; exit $exit; } while (1) { my $pid = waitpid(-1, WNOHANG); if ($pid > 0) { my $exit_code = $?/256; print "Child process $pid finished with exit code $exit_code\n"; last; } print "Parent could do something else, but now sleeping\n"; sleep 0.1; } }
perl active_waiting.pl 0 0 perl active_waiting.pl 1 0 perl active_waiting.pl 1 1