#!/usr/bin/perl use Fcntl; use strict; use vars qw(@sig $sig $lidx); my $FIFO = '.sig-dyn'; #$SIG{PIPE} = sub { warn("Broken pipe: $!\n") }; $SIG{PIPE} = 'IGNORE'; $SIG{HUP} = \&readsigs; $SIG{TERM} = sub { exit(0) }; sub readsigs () { chdir; if(sysopen(SIGS, join('/',$ENV{HOME}, qw(sigd sigfile)), O_RDONLY, undef)) { $/ = "--\n"; chomp(@sig = ); close(SIGS); $sig = sub { my $idx; for($idx = $lidx; $idx == $lidx; $idx = int(rand(@sig))) {} join('', "-- \n", $sig[$lidx = $idx]); }; } else { $sig = sub { "-- \n".`fortune -s` } } unless(-p $FIFO) { rename($FIFO, "$FIFO~"); system(mkfifo => $FIFO) && system(mknod => $FIFO, 'p') && die("mk{nod|fifo} failed: $!\n"); } } readsigs(); fork() && exit(0); SIGLOOP: { my $wi = ''; my $wo = ''; while (-p $FIFO) { my $s = $sig->(); my $l = length($s); sysopen(FIFO, $FIFO, O_WRONLY|O_SYNC, undef) || die("sysopen(FH, $FIFO, O_WRONLY|O_SYNC, undef) failed: $!\n"); syswrite(FIFO, $s, $l, 0); close(FIFO); select(undef(), undef(), undef(), 0.5); } } warn("$FIFO is not a pipe: exiting\n"); exit(0);