【问题标题】:How to spawn other programs within perl script and immediately continue Perl processing?如何在 perl 脚本中生成其他程序并立即继续 Perl 处理?
【发布时间】:2011-11-16 19:58:42
【问题描述】:

如何在 perl 脚本中生成其他程序并立即继续 Perl 处理(而不是暂停直到生成的程序终止)? 是否可以在生成的程序运行时处理它的输出而不是等待它结束?

【问题讨论】:

标签: perl multiprocessing


【解决方案1】:

您可以为此使用open(使用两个命令行参数运行程序/bin/some/program):

open my $fh, "-|", "/bin/some/program", "cmdline_argument_1", "cmdline_argument_2";
while (my $line = readline($fh)) {
    print "Program said: $line";
}

阅读$fh 将为您提供正在运行的程序的标准输出。

反之亦然:

open my $fh, "|-", "/bin/some/program";
say $fh "Hello!";

这会将您在文件句柄上写入的所有内容通过管道传输到衍生进程的标准输入。

如果您想在同一个进程中读写,请查看IPC::Open3IPC::Cmd 模块。

【讨论】:

    【解决方案2】:

    要在后台运行程序并“继续”,您只需在命令末尾添加“&”(我假设您使用的是 Linux)。示例:system("command &"); 请注意 system("command", "arg1", "&"); 将不起作用,因为它将“&”传递给命令而不是 shell。您可以通过执行以下操作简单地打印命令的输出:print system("command");

    【讨论】:

    • 当您投反对票时,请写下评论为什么它没有用。我认为这是一个有效的答案,因为有两个问题,一个是处理输出,另一个是继续其余代码而不等待命令完成。如果我错了,我会很高兴知道原因
    • system() 不返回命令的输出,而是返回代码/退出状态。子进程从调用 system() 的进程继承 stdin/out/err。此外,我不喜欢鼓励人们使用单参数 system() - 它会带来可怕的安全风险。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 2017-06-14
    • 2014-02-10
    • 2015-09-11
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    相关资源
    最近更新 更多