我怎么知道perl IO :: Pipe的另一端的PID

时间:2012-05-28 05:09:29

标签: perl process pipe pid

我已经使用IO :: Pipe

设置了另一个我关注输出的进程
my $pipe  = IO::Pipe->new();
my $fh    = $pipe->reader( $dirWatcher );

然后我设置了一个IO :: Select来观看$ fh。

一切正常,但有时我想杀死$ dirWatcher进程。

我的第一个想法是在创建阅读器时保存PID,然后在需要时调用kill。

但是,IO :: Pipe似乎没有为我提供了解PID的方法。

那么我必须复制IO :: Pipe :: reader的功能吗?有一种我想念的简单方法吗?

2 个答案:

答案 0 :(得分:1)

IO :: Pipe的readerwriter方法返回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 ...
           }