IO::Pipeのreader
およびwriter
メソッドは、IO::Pipe::End のインスタンスを返します。このクラスは IO::Handle をclose
メソッドで特殊化します。
sub close {
my $fh = shift;
my $r = $fh->SUPER::close(@_);
waitpid(${*$fh}{'io_pipe_pid'},0)
if(defined ${*$fh}{'io_pipe_pid'});
$r;
}
プロセス ID はそこにありますが、パブリック インターフェイスでは公開されません。これはギャップのようです。
次のプログラムのように pid を取得できます。
#! /usr/bin/env perl
use strict;
use warnings;
use IO::Pipe;
my $pipe = IO::Pipe->new;
my $fh = $pipe->reader("sleep 5; echo hi");
my $pid = ${*$pipe}{'io_pipe_pid'};
system "ps", "ww", $pid;
print while <$fh>;
出力:
$ ./get-reader-pid
PID TTY STAT TIME コマンド
3500pts/0 S+ 0:00 sh -c sleep 5; エコーハイ
【5秒待ち】
こんにちは
perlmodlibのドキュメントが示すように、オブジェクトの内部を突っ込むことは重大な罪ではありません。ただし、リスクを理解してください。
Perl は、C++、Ada、Modula-17 などの他の言語で慣れているように、モジュールのプライベート部分とパブリック部分を強制しません。Perl は強制されたプライバシーに夢中になりません。散弾銃を持っているからではなく、招待されていないので、リビングルームから離れたほうがいいでしょう。
これを行うのは少し汚いと感じるかもしれませんが、そうすべきです。これは公開インターフェースの一部ではないため、予告なく変更される場合があります。実際には、変化の可能性は低く、変化したとしても簡単に適応できます。