Named Pipes |
A named pipe (often referred to as a FIFO) is an old Unix IPC mechanism for processes communicating on the same machine. It works just like a regular, connected anonymous pipes, except that the processes rendezvous using a filename and don't have to be related.
To create a named pipe, use the POSIX::mkfifo()
function.
use POSIX qw(mkfifo); mkfifo($path, 0700) or die "mkfifo $path failed: $!";
You can also use the Unix command mknod(1)
or on some
systems, mkfifo(1). These may not be in your normal path.
# system return val is backwards, so && not || # $ENV{PATH} .= ":/etc:/usr/etc"; if ( system('mknod', $path, 'p') && system('mkfifo', $path) ) { die "mk{nod,fifo} $path failed"; }
A fifo is convenient when you want to connect a process to an unrelated one. When you open a fifo, the program will block until there's something on the other end.
For example, let's say you'd like to have your .signature file be a named pipe that has a Perl program on the other end. Now every time any program (like a mailer, news reader, finger program, etc.) tries to read from that file, the reading program will block and your program will supply the new signature. We'll use the pipe-checking file test -p to find out whether anyone (or anything) has accidentally removed our fifo.
chdir; # go home $FIFO = '.signature';
while (1) { unless (-p $FIFO) { unlink $FIFO; require POSIX; POSIX::mkfifo($FIFO, 0700) or die "can't mkfifo $FIFO: $!"; }
# next line blocks until there's a reader open (FIFO, "> $FIFO") || die "can't write $FIFO: $!"; print FIFO "John Smith (smith\@host.org)\n", `fortune -s`; close FIFO; sleep 2; # to avoid dup signals }
Back to Handling the SIGHUP Signal in Daemons in the perlipc manpage
Forward to Deferred Signals (Safe Signals) in the perlipc manpage
Up to the perlipc manpage
Named Pipes |