子プロセスの標準入力と標準出力を親プロセスとパイプでつないで子プロセスを起動するには

子プロセスを起動して、その子プロセスの標準入力は親プロセスからパイプとして書き出しをして、子プロセスの標準出力は親プロセスでパイプとして読み込みをする方法。

以下のサンプルコードは、子プロセスとして sed を起動する例。

PHP

$desc = array(
  0 => array('pipe', 'r'),
  1 => array('pipe', 'w'),
);
$proc = proc_open('sed s/Name:/Hello,/g', $desc, $pipes);

fputs($pipes[0], "Name: foo\n");
fputs($pipes[0], "Name: bar\n");
fclose($pipes[0]);

while (!feof($pipes[1])) {
  $line = fgets($pipes[1]);
  echo $line;
}
fclose($pipes[1]);

proc_close($proc);

proc_open 関数 | PHP Manual
http://php.net/manual/ja/function.proc-open.php

proc_close 関数 | PHP Manual
http://php.net/manual/ja/function.proc-close.php

Perl

my $CHILD_READER;
my $CHILD_WRITER;
my $PARENT_READER;
my $PARENT_WRITER;
pipe($CHILD_READER, $PARENT_WRITER);
pipe($PARENT_READER, $CHILD_WRITER);

my $pid1 = fork;
if ($pid1) {
    # 親プロセス
    close $CHILD_READER;
    close $CHILD_WRITER;
    print $PARENT_WRITER "Name: foo\n";
    print $PARENT_WRITER "Name: bar\n";
    close $PARENT_WRITER;
    print $_ foreach (<$PARENT_READER>);
} else {
    # 子プロセス
    die unless defined $pid1;
    close $PARENT_READER;
    close $PARENT_WRITER;
    open(STDIN, '<&=', fileno($CHILD_READER));
    open(STDOUT, '>&=', fileno($CHILD_WRITER));
    exec('sed', 's/Name:/Hello,/g');
}
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。