#!/usr/bin/env perl use warnings; use strict; use Data::Dump; use IPC::Run qw/ start /; print STDERR "Starting...\n"; my @procs = ( { n=>'Foo', c=>['socat','pty,rawer,link=/tmp/fakepty1','-'], v=>sub { "Foo,".(time-$^T).",".int(rand(100))."\n" } }, { n=>'Bar', c=>['socat','pty,rawer,link=/tmp/fakepty2','-'], v=>sub { "Bar,".(time-$^T).",".int(rand(100))."\n" } }, ); for my $p (@procs) { $p->{i} = \(my $i=''); $p->{o} = \(my $o=''); $p->{p} = start $p->{c}, $p->{i}, $p->{o}; } print STDERR "Running...\n"; my $run = 1; local $SIG{INT} = sub { print STDERR "Caught SIGINT\n"; $run = 0 }; while ($run) { for my $p (@procs) { sleep 1; ${$p->{i}} .= $p->{v}->(); $p->{p}->pump; if ( length ${$p->{o}} ) { dd $p->{n}, ${$p->{o}}; ${$p->{o}} = ''; } } } $_->{p}->signal('INT') for @procs; $_->{p}->finish for @procs; print STDERR "Done.\n";