#!/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; } #### #!/usr/bin/env perl use strict; use warnings; use autodie; use constant { TESTS => 5, WAIT_RAND => 3, }; use PM_1133400_Shared qw{:WEB}; my $total_steps = get_total_steps(); my @queue; { local $| = 1; for (1 .. TESTS) { sleep int rand WAIT_RAND; my $rand_step = int rand $total_steps; if (-p FIFO) { open my $pipe_writer, '>', FIFO; if (@queue) { for (@queue) { print "WEB_SIM: FIFO Available! Piping from queue [$_]\n"; print $pipe_writer "$_\n"; } @queue = (); } print "WEB_SIM: FIFO Available! Piping new step [$rand_step]\n"; print $pipe_writer "$rand_step\n"; close $pipe_writer; } else { print "WEB_SIM: FIFO Unavailable! Queueing step [$rand_step].\n"; push @queue, $rand_step; } } } #### package PM_1133400_Shared; use strict; use warnings; use autodie; use constant FIFO => 'pm_1133400_fifo'; use Exporter qw{import}; our @EXPORT_OK = qw{FIFO get_steps get_total_steps remove_fifo}; our %EXPORT_TAGS = ( SQL => [qw{FIFO get_steps remove_fifo}], WEB => [qw{FIFO get_total_steps}], ); { my @steps = ( sub { print "Step 0\n" }, sub { print "Step 1\n" }, sub { print "Step 2\n" }, sub { print "Step 3\n" }, sub { print "Step 4\n" }, sub { print "Step 5\n" }, sub { print "Step 6\n" }, sub { print "Step 7\n" }, sub { print "Step 8\n" }, sub { print "Step 9\n"; remove_fifo(); print "Done!\n"; exit; }, ); sub get_steps { [@steps] } sub get_total_steps { scalar @steps } } sub remove_fifo { unlink FIFO if -e FIFO } 1; #### pm_1133400_sim_sql.pl & pm_1133400_sim_web.pl #### WEB_SIM: FIFO Unavailable! Queueing step [5]. SQL_SIM: Executing normal step: Step 0 SQL_SIM: Executing normal step: Step 1 WEB_SIM: FIFO Available! Piping from queue [5] ... SQL_SIM: Executing web request: Step 5 #### SQL_SIM: Executing normal step: Step 0 SQL_SIM: Executing normal step: Step 1 WEB_SIM: FIFO Available! Piping new step [4] SQL_SIM: Executing web request: Step 4 SQL_SIM: Executing normal step: Step 5 SQL_SIM: Executing normal step: Step 6 ...