我想创建一个简单的IO对象,代表一个管道打开另一个程序,我可以定期写入另一个程序的STDIN作为我的应用程序运行.我想要它是防弹的(因为它捕获所有错误)和跨平台.我可以找到最好的选择是:

打开

sub io_read {
    local $SIG{__WARN__} = sub { }; # Silence warning.
    open my $pipe,'|-',@_ or die "Cannot exec $_[0]: $!\n";
    return $pipe;
}

优点:

>跨平台
>简单

缺点

> No $SIG {PIPE}从管道程序中捕获错误
>其他错误是否被捕获?

IO ::管

sub io_read {
    IO::Pipe->reader(@_);
}

优点:

>简单
>返回OO接口的IO :: Handle对象
>由Perl核心支持.

缺点

>仍然没有$SIG {PIPE}从管道程序中捕获错误
> Win32不支持(或至少,its tests被跳过)

IPC ::运行

在IPC :: Run中没有写入文件句柄的接口,只附加到标量.这似乎很奇怪

IPC :: RUN3

这里也没有文件句柄界面.我可以使用一个代码引用,它将被重复地调用到子节点,但是查看源代码,看起来它实际写入一个临时文件,然后打开它并将其内容截取到pipe’d命令的STDIN.世界卫生大会?

IPC :: Cmd的

仍然没有文件句柄界面.

我在这里缺少什么?似乎这应该是一个解决的问题,我很震惊,它不是. IO ::管道最接近我想要的,但缺少$SIG {PIPE}错误处理和对Windows的缺乏支持令人不安. JDWIM的管道模块在哪里?

解决方法

感谢@ikegami的指导,我发现在Perl中交互式阅读和写入另一个进程的最佳选择是IPC :: Run.但是,它要求您正在读取和写入的程序在写入其STDOUT(例如提示)时具有已知的输出.这是一个执行bash的例子,它运行ls -l,然后打印输出:
use v5.14;
use IPC::Run qw(start timeout new_appender new_chunker);

my @command = qw(bash);

# Connect to the other program.
my ($in,@out);
my $ipc = start \@command,'<' => new_appender("echo __END__\n"),\$in,'>' => new_chunker,sub { push @out,@_ },timeout(10) or die "Error: $?\n";

# Send it a command and wait until it has received it.
$in .= "ls -l\n";
$ipc->pump while length $in;

# Wait until our end-of-output string appears.
$ipc->pump until @out && @out[-1] =~ /__END__\n/m;

pop @out;
say @out;

因为它是作为一个IPC运行的(我假设),当它完成写入其STDOUT时,bash不会发出提示.所以我使用new_appender()函数让它发出一些我可以匹配来找到输出的结尾(通过调用echo __END__).在调用new_chunker之后,我也使用了一个匿名子例程来将输出收集到一个数组中,而不是一个标量(只要传递一个标量的引用到’>’,如果你愿意的话).

所以这是有效的,但它吸引了很多原因,在我看来:

>没有一般的有用的方法来知道IPC控制的程序已经完成打印到其STDOUT.相反,您必须在其输出上使用正则表达式来搜索通常意味着完成的字符串.
>如果它不发出一个,你必须把它引入一个(正如我在这里做的 – 上帝禁止我应该有一个名为__END__的文件).如果我正在控制一个数据库客户端,我可能需要发送一些像“这里的IM OUTTA”这样的东西.不同的应用程序将需要不同的new_appender黑客.
>对魔术$in和$out标量的写作感觉很奇怪,并且在一个距离的行动.我不喜欢
>如果标题是文件句柄,则不能对标量进行线性处理.因此它们效率较低.
>使用new_chunker获取线性输出的能力是很好的,如果还是有点奇怪.尽管如此,通过IPC :: Run可以高效地缓存来从程序中读取输出的效率.

我现在意识到,虽然IPC :: Run的接口可能会更好一些,但总体来说,IPC模型的缺点尤其在于处理这个问题.没有一般有用的IPC界面,因为人们必须知道要运行的特定程序的具体细节.这可以,如果您确切知道它将如何对输入做出反应,并且可以可靠地识别何时完成发布输出,并且不需要担心跨平台兼容性.但是,这远远不足以满足我对通用有用的方式与CPAN模块中的各种数据库命令行客户端进行交互的需求,该模块可以分发给整个操作系统.

最后,由于a blog post评论中的包装建议,我决定放弃使用IPC控制这些客户端,而是使用the DBI.它提供了一个优秀的API,强大,稳定和成熟,并且没有任何IPC的缺点.

我对那些跟随我的人的建议是:

>如果您只需要执行另一个程序并等待完成,或者在完成运行时收集其输出,请使用IPC::System::Simple.否则,如果您需要做的是与其他内容进行交互式接口,请尽可能使用API .如果不可能的话,请使用像IPC::Run这样的东西,尽量做到这一点 – 并准备好放弃你的时间让它“正确”.

什么是首选的跨平台IPC Perl模块?的更多相关文章

  1. ios – 从不兼容类型’ViewController * const__strong’分配给’id’

    我的应用程序中有一个ImagePickerController.它效果很好,但除了ipc.delegate=self之外;出现错误消息:Assigningto‘id’fromincompatibletype‘ViewController*const__strong’该应用程序运行良好,所以我忽略了错误消息,但我想我需要知道原因.为什么会出现错误消息?解决方法如果你看一下UIImagePickerC

  2. Swift快速入门五集合

    相关文章Swift快速入门(一)第一个Swift程序Swift快速入门(二)基本数据类型Swift快速入门(三)运算符Swift快速入门(四)流程控制前言Swift提供了数组和字典两种集合类型来存储数据,Swift的数组用来存储顺序相同类型相同的类型,字典则采用kay-value的形式存储数据。修改字典字典提供了updataValue()方法来修改字典的value值,该方法会返回一个Sting?

  3. android – 是否有可能创建一个可以由非Mono开发人员使用的MonoDroid和MonoTouch的跨平台共享库?

    Android库我们可以生成一个Android库作为MonoDroid的输出,其他开发人员使用ADT和Java开发能够使用他们的应用?iOS库我们可以从MonoTouch生成一个库,ObjectiveC开发人员能够在他们的应用程序中使用吗?解决方法对于这两种情况,答案都是否定的,无法在MonoTouch或MonoforAndroid上创建非托管应用程序可以使用的托管库.这是因为托管库严重依赖托管运行时,它们不是独立库.

  4. android – 来自Parcel.readException的NullPointerException(等)

    解决方法这里发生的是readException()正在检查IPC字节流中是否有一个标题,表明发生了异常;如果它找到一个,那么它会抛出该类型的新异常,并使用相同的消息,但是缺少原始堆栈跟踪.那么最初的例外来自哪里?

  5. android – 轻量级跨平台C GUI(OpenGL)

    我正在寻找一个轻量级的跨平台GUI库,用于不同的信号处理应用程序.ANSI-C程序必须与其静态链接,并且大小很重要.完成的应用程序必须在iPad,iPhone,Android,Ubuntu,Leopard,Windows等平台上具有相同的外观.Qt不合适,因为它太大了,并且在iOS设备上不起作用.我倾向于基于OpenGL的GUI库,因为每个现代目标平台都支持OpenGL,并且OpenGL应用程序在

  6. android – 从HTML网页向移动设备地址簿添加联系人

    我目前正在建立一个网站,只需轻轻一点,您就可以在IPhone/Android地址簿中添加联系人.该网站目前是HTML5,但可以实现Javascript和/或PHP选项.那么有没有一种方法,点击链接,移动设备将打开已经填写了我想要的信息的地址簿.我到处寻找只能找到能够做同样事情的应用程序的方法.我想从网页上创建它.在哪里,我可以学习如何做到这一点?

  7. 如何在Xamarin android和ios中安装线程?

    解决方法使用XamarinForms的多平台方式将是编辑:在阅读之后你真的想要阻止mainthread继承阻止线程的多平台方式:

  8. Django 报错:Broken pipe from ('127.0.0.1', 58924)的解决

    这篇文章主要介绍了Django 报错:Broken pipe from ('127.0.0.1', 58924)的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  9. Android IPC机制ACtivity绑定Service通信代码实例

    这篇文章主要介绍了Android IPC机制ACtivity绑定Service通信代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

  10. 浅谈并发处理PHP进程间通信之System V IPC

    对于进程间通信,每一个完备的语言都应该有对应的处理方式,而 PHP 对应的则是一族对 UNIX SYSTEM V包装的函数,包括信号量(semaphore)、共享内存(shared memory)和消息队列(msg queue)的操作。

随机推荐

  1. 数组 – Perl中有什么神奇的数组?

    在Perldocumentationforreverse中,我发现:“请注意,将数组反转到自身(如@a=reverse@a)将尽可能保留不存在的元素;即对于非魔法数组或具有EXISTS和DELETE方法的绑定数组.什么属性区分神奇和非魔法阵列?解决方法一个神奇的阵列是一个执行它的操作不仅仅是改变内容.只有内置的魔术阵列是@ISA,而且这是非常不明显的.正如句子所暗示的,魔术阵列主要是一个绑定的阵列

  2. perl – 使用“isa”方法的最佳方式?

    什么是“最好的”使用方式“isa()”可靠?解决方法Scalar::Util实现明确更好.它避免了eval{}的开销,它总是导致设置一个附加变量.Scalar::Util实现更容易阅读.如果eval也失败了,我相信发生的是你在树之前向后走到eval之前的状态–这是如何实现复位状态.这带来了额外的故障开销.基准根本不是一个对象对象传递isa检查对象出现故障现象检查测试代码:我使用这是为i486-linux-gnu-thread-multi建立的perl,v5.10.1(*),以及Scalar::Util,1

  3. 在CORE :: GLOBAL中哪些Perl内置函数不能被覆盖?

    解决方法toke.c中任何值为负的值都可以被覆盖;所有其他人可能不会.你可以看源码here.例如,我们来看看第10,396行的waitpid:由于waitpid为负数,因此可能会被覆盖.grep怎么样?这是积极的,所以不能被覆盖.这意味着以下关键字不能被覆盖:chop,defined,delete,do,dump,each,else,elsif,eval,exists,for,foreach,format,glob,goto,grep,if,keys,last,local,m,map,my,next,no

  4. 如何在Perl中打印由换行符分隔的列表元素?

    什么是最简单的打印所有列表的元素以Perl中的换行符分隔的元素?解决方法在Perl5.10中:其他方式:或:或者怎么样?

  5. 使用Perl如何获取文件大小(以兆字节为单位)?

    我想以磁盘的形式获取磁盘上的文件大小.使用-s运算符给出了以字节为单位的大小,但是我将假设,然后将其除以魔术数字是一个坏主意:我应该使用只读变量来定义1024,还是有一种编程方式来获取一千字节的字节数?

  6. perl – 如何测试/分类CPAN模块的utf8正确性

    例如:File::Slurp,如果你将读取该文件您将根据命令行开关获得不同的结果,并且perl-CSDA将无法正常工作.伤心.(是的,我知道比Encode::decode(“utf8”,read_file($file,binmode=>’:raw’));将帮助,但是SAD.我的问题:>在这里任何首选方式,如何测试/分类什么CPAN模块是utf8安全/准备/正确?>这里是像Perl::Criticforutf8这样的东西–什么将检查模块源可能的utf8不正确?总结以上是DEVMAX为你收集整理的perl–如

  7. 如何删除Perl字符串中的空格?

    如果我声明一个值为’3’的变量$myString.是否有任何功能来删除返回值的空格.有点像SomeFun然后返回’3′.输出:你可以注意到’vid’=>‘0’,上面的代码从theanswer.我正在研究它.总结以上是DEVMAX为你收集整理的如何删除Perl字符串中的空格?如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

  8. 如何在mod_perl2下运行Devel :: Cover?

    Unfortunately,Devel::Coverdoesnotyetworkwiththreads.它也不适用于prefork.在startup.pl中使用,Devel::Cover问题perl5.8.9,Apache2.2.13.我的操作系统是FreeBSD,如果重要.同样的问题是reportedforwin32.更新:PerlTrace全部输出解决方法邪恶之源似乎是Apache::DBI.

  9. 如何使用Perl中的C类?

    我有一套用C写的课.从Perl脚本中调用它们的最佳方法是什么?

  10. perl – 在Emacs中以双模式更好的缩进

    我正在使用Emacs来修改Perl和Verilog交织的代码.我正在使用two-mode-mode在两者之间切换,这样可以预期.问题是perl代码与//一行一行地表示;如下图所示:而双模式则认识到它是Perl,它是逐行的,所以缩进等在线上无意义.我想做的是使Perl代码像往常一样格式化,但忽略//;字符.有什么想法吗?我刚刚开始偷看模式文件,它们是可以理解的复杂的,所以任何提示都不会感激!

返回
顶部