Communicating Between Related Processes
Problem
You have two related processes that need to communicate, and you need
better control than you can get from open
,
system
, and backticks.
Solution
Use pipe
and then fork
:
pipe(READER, WRITER); if (fork) { # run parent code, either reading or writing, not both } else { # run child code, either reading or writing, not both }
Or use a special forking form of open
:
if ($pid = open(CHILD, "|-")) { # run parent code, writing to child } else { die "cannot fork: $!" unless defined $pid; # otherwise run child code here, reading from parent }
Or, going the other way:
if ($pid = open(CHILD, "-|")) { # run parent code, reading from child } else { die "cannot fork: $!" unless defined $pid; # otherwise run child code here, writing to parent }
Discussion
Pipes are simply two connected filehandles, where data written to one
filehandle can be read by the other. The pipe
function creates two filehandles linked in this way, one writable and
one readable. Even though you can’t take two already existing
filehandles and link them, pipe
can be used for
communication between processes. One process creates a pair of
filehandles with the pipe
functions, then forks
off a child, resulting in two distinct processes both running in the
same program, each with a copy of the connected filehandles.
It doesn’t matter which process is the reader and which is the writer, so long as one of them takes one role and its peer process takes the other. You can only have one-way communication. ...
Get Perl Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.