我已经使用IO :: Pipe
设置了另一个我关注输出的进程my $pipe = IO::Pipe->new();
my $fh = $pipe->reader( $dirWatcher );
然后我设置了一个IO :: Select来观看$ fh。
一切正常,但有时我想杀死$ dirWatcher进程。
我的第一个想法是在创建阅读器时保存PID,然后在需要时调用kill。
但是,IO :: Pipe似乎没有为我提供了解PID的方法。
那么我必须复制IO :: Pipe :: reader的功能吗?有一种我想念的简单方法吗?
答案 0 :(得分:1)
IO :: Pipe的reader
和writer
方法返回IO :: Pipe :: End的实例。该类使用close
方法专门化IO :: Handle。
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 COMMAND 3500 pts/0 S+ 0:00 sh -c sleep 5; echo hi [5-second wait] hi
正如perlmodlib文件所示,戳入物体的内部并不是一个严重的罪。然而,了解风险。
Perl不会强制执行其模块的私有和公共部分,因为您可能习惯使用其他语言,如C ++,Ada或Modula-17。 Perl对强制隐私没有迷恋。因为你没有被邀请,所以你宁愿呆在客厅外面,也不是因为它有霰弹枪。
你可能觉得这样做有点脏,你应该这样做。它不是公共界面的一部分,因此如有变更,恕不另行通知。实际上,变化的可能性很低,即使确实发生了变化,您也可以轻松适应变化。
答案 1 :(得分:0)
来自 perldoc IO :: Pipe
use IO::Pipe;
$pipe = new IO::Pipe;
if($pid = fork()) { # Parent
$pipe->reader();
while(<$pipe>) {
...
}
}
elsif(defined $pid) { # Child
$pipe->writer();
print $pipe ...
}