子プロセスの標準入力と標準出力を親プロセスとパイプでつないで子プロセスを起動するには 2015/07/27
子プロセスを起動して、その子プロセスの標準入力は親プロセスからパイプとして書き出しをして、子プロセスの標準出力は親プロセスでパイプとして読み込みをする方法。
以下のサンプルコードは、子プロセスとして sed
を起動する例。
PHP 2015/07/27
$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 2015/10/15
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');
}