#!/usr/bin/env perl use strict; use warnings; use autodie; use constant SQL_STEP_INTERVAL => 1; use IO::Select; use POSIX qw{mkfifo}; use PM_1133400_Shared qw{:SQL}; sub _handle_death_signal { my $sig = shift; remove_fifo(); die "\nSQL_SIM: Trapped and handled SIG$sig signal. Exiting.\n"; } BEGIN { my @death_signals = qw{INT HUP}; @SIG{@death_signals} = (\&_handle_death_signal) x @death_signals; remove_fifo(); mkfifo FIFO, 0600; } END { remove_fifo(); } my @steps = @{get_steps()}; my $step = $#steps; { local $| = 1; if (fork) { open my $keep_alive_pipe_writer, '>', FIFO; wait; close $keep_alive_pipe_writer; exit; } open my $pipe_reader, '<', FIFO; my $select = IO::Select::->new(); $select->add($pipe_reader); while (1) { while ($select->can_read(0)) { $step = <$pipe_reader>; chomp $step; print 'SQL_SIM: Executing web request: '; $steps[$step]->(); } print 'SQL_SIM: Executing normal step: '; $step = ++$step % @steps; $steps[$step]->(); sleep SQL_STEP_INTERVAL; } close $pipe_reader; }