如何知道perl IO::管道另一端的PID

如何知道perl IO::管道另一端的PID,perl,process,pipe,pid,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的函数吗?有没有

我使用IO::Pipe设置了另一个监视输出的进程

my $pipe  = IO::Pipe->new();
my $fh    = $pipe->reader( $dirWatcher );
然后我设置了一个IO::Select来观看$fh

这一切都很好,但有时我想终止$dirWatcher进程

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

然而,IO::Pipe似乎并没有为我提供了解PID的方法

所以我必须复制IO::Pipe::reader的函数吗?有没有一种简单的方法我遗漏了?

来自perldoc IO::Pipe

IO::Pipe的读写器方法返回IO::Pipe::End的实例。这个类使用close方法专门处理IO::Handle

进程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 正如文档所指出的,戳入对象的内部并不是一种严重的罪恶。然而,要了解风险

Perl不强制执行它的模块的私有和公共部分,如您可能已经习惯于其他语言,如C++、艾达或Muldi-17。Perl并不迷恋强制隐私。它宁愿你不去它的客厅,因为你没有被邀请,而不是因为它有一把猎枪


你可能会觉得这样做有点肮脏,你应该这样做。它不是公共界面的一部分,因此可能会更改,恕不另行通知。实际上,发生变化的可能性很低,即使确实发生了变化,您也可以轻松适应。

我曾尝试使用这种结构,但没有僵尸,无法获得干净的解决方案。
#! /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