in reply to Having a difficult time understanding fork()
Based on the description of your requirement, it sounds like you will need to fork two children - one to check the server, one to do the countdown. Something like this:
use strict; use warnings; use feature qw(:5.10); # Fork off two child processes my ($who_am_i, $countdown_pid, $checking_pid); $countdown_pid = fork(); if ($countdown_pid == 0){ $who_am_i = "countdown process"; } elsif ($countdown_pid){ $checking_pid = fork(); if ($checking_pid == 0){ $who_am_i = "checking process"; } elsif ($checking_pid){ $who_am_i = "controlling process"; } else{ die "Error forking: $!"; } } else{ die "Error forking: $!"; } # Each process does different things: given($who_am_i){ when ("countdown process"){ sleep_count(3, 'Verifying with Nagios that resin is down: '); } when ("checking process"){ # repeatedly do server check via "nagios" } when ("controlling process"){ # Wait on the "checking process" to complete. waitpid($checking_pid, 0); # Kill countdown timer kill("TERM", $countdown_pid); waitpid($countdown_pid, 0); } }
You should probably check the exit status of your child processes (via $? after the waitpid calls).
Hope this helps.
Update: Actually, there's no need to have three processes. Two is enough, as in your post, although conceptually I like the idea of delegating each subtask to separate child processes.
Perhaps the only piece that was really missing from your code was killing off the countdown timer.
|
---|